gpt4 book ai didi

.net - 存储库基础或特定方法?

转载 作者:行者123 更新时间:2023-12-04 20:00:36 24 4
gpt4 key购买 nike

我一直在开发一个应用程序,我正在尝试应用 DDD 和其他工具(Nhibernate 和 asp.net MVC)。

在这个应用程序中,我们需要在存储库的 Person 实体中按名称实现“搜索”。所以,我们有一个存储库库(RepositoryBase 类),在这个实现中,我有一个适用于这个项目的通用方法。

public IEnumerable<T> FindAll(Expression<Func<T, bool>> condition) {
return Session.QueryOver<T>().Where(condition);
}

在我的 asp.net mvc 应用程序中,我们可以像这样使用它:
var list = _repositoryPerson.FindAll(x => x.Name == "Felipe");

另一方面,我们可以为此任务创建一个特定的方法(在 RepositroyPerson 类中),例如:
public IEnumerable<Person> FindByName(string name) {
return Session.QueryOver<Person>().Where(x => x.Name == name);
}

在我的 asp.net mvc 应用程序中,我们可以像这样使用它:
var list = _repositoryPerson.FindByName("Felipe");

我的问题是:

1 - 符合 DDD 要求的推荐方法是什么?特定类还是基类?

2 - 有人用 Nhibernate QueryOver 推荐了一些很好的 Repository 基础(通用)实现?

如果有人可以帮助我,我将不胜感激!
谢谢

更新:

例如,如果我需要一个复杂的搜索,比如组合条件……例如:姓名(可选)和年龄(可选)和城市(可选)和其他字段……每个字段都是可选的,并与其他字段组合!使用表达式将是推荐的还是不推荐的?你将如何实现这段代码?

PS:对不起我的英语!

谢谢

最佳答案

为了两全其美,您可以实现 FindByName方法与您在基类中的一般方法一样,将其标记为 protectedprotected internal (取决于您是否希望允许其他程序集定义 Repository 实现),然后从您的特定存储库对象中调用它。

protected internal IEnumerable<T> FindAll(Expression<Func<T, bool>> condition) {
return Session.QueryOver<T>().Where(condition);
}

public IEnumerable<Person> FindByName(string name) {
return base.FindAll(x => x.Name == name);
}

这将允许您为将使用该方法的情况编写特定的测试,同时还允许您更改 ORM 实现,而无需在很多地方更改它。

更新:
为了在 FindAll 中组合多个条件,你可以简单地使用 Aggregate 组合它们(我没有用 NHibernate 测试过这个,但如果它坏了,你可以用 foreach 替换它)。
public IEnumerable<T> FindAll(IEnumerable<Expression<Func<T, bool>>> conditions)
{
return conditions.Aggregate(Session.QueryOver<T>(), (current, condition) => current.Where(condition)).List();
}

然后方法可以采用可选参数,并创建传递给 FindAll 的条件列表。
   public IEnumerable<T> FindByParams(string name=null, string city=null)
{
var wheres = new List<Expression<Func<T, bool>>>();

if (name != null)
{
wheres.Add(x => x.Name == name);
}
if (city != null)
{
wheres.Add(x => x.City == city);
}
return base.FindAll(wheres);
}

关于.net - 存储库基础或特定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6711379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com