我一直在开发一个应用程序,我试图aply 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 base(generic)的一些很好的实现?
如果有人可以帮助我,我会非常感激! 感谢
更新:
如果我需要,例如,像一个复杂的搜索相结合的条件...如:名称(可选)和年龄(可选)和城市(可选)等领域......每个领域都是可选的,并与其他领域相结合!使用表达将是推荐的或不是?你将如何实现这个代码?
PS:Sorry for my english!
感谢
是的,Ryan,我认为在这个解决方案中,我也是这样做的,但是看看这个代码(我的意思是......你选择了'保护内部'),我想如果有任何问题来保证它'公开',有什么问题吗?也许这听起来像做另一种选择,但我知道这不是建议。但是,您的解决方案很好,谢谢:D –
我与受保护或受保护内部一起使用的原因是因为这可确保您的存储库的客户端不会直接调用FindAll方法。如果你公开了它,并且客户端使用了它,这将需要你从客户端的单元测试中测试Repository的功能,这将违背DDD。 –
不错的解释瑞恩,我明白了,这听起来像是为了在存储库中返回IEnumerable insted IList的原因,用户可以执行与所讨论的点的目标不同的其他任务,如在IList中,此存储库的用户可以调用例如,“添加”方法。谢谢:D –