大佬教程收集整理的这篇文章主要介绍了domain-driven-design – 在哪个层中,Specification Pattern对象应该是“new’ed up”?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是,在一个n层的架构中,我应该在哪些地方获得“新的”规范?
>我可以把它们放在我的服务层(也就是说,应用程序层,它有时被称为……基本上,.aspx代码隐藏的东西会说话),但我觉得通过这样做,我让业务规则漏掉了域名.如果以其他方式(除了服务层)访问域对象,则域对象无法强制执行自己的业务规则.
>我可以通过构造函数注入将规范注入到我的Model类中.但同样,这感觉“错误”.我觉得唯一应该注入Model类的是“服务”,比如缓存,日志记录,脏标记跟踪等等……如果你能避免它,使用Aspects而不是乱丢模型的构造函数具有大量服务接口的类.
>我可以通过方法注入(有时称为“Double Dispatch”)注入规范,并明确地使用该方法封装注入的规范以强制执行其业务规则.
>创建一个“域服务”类,它将通过构造函数注入获取规范,然后让服务层使用域服务来协调Domain对象.这对我来说似乎没问题,因为规范强制执行的规则仍然在“域”中,并且域服务类的命名非常类似于它正在协调的域对象.这里的事情是我觉得我正在编写大量的类和代码,只是为了“正确”实现规范模式.
除此之外,相关规范要求存储库以确定它是否“满意”.
这可能会导致性能问题,尤其是如果我使用构造函数注入b / c消耗代码可以调用一个可能包装规范的属性,并且反过来调用数据库.
所以任何想法/想法/链接到文章?
新手和使用规格的最佳位置在哪里?
您主要在服务层中使用规范,因此存在.
答案很长:
首先,这里有两个问题:
你的规格应该放在哪里,它们应该在哪里新建?
就像您的存储库接口一样,您的规范应该存在于域层中,因为它们毕竟是特定于域的.有一个question on SO在存储库接口上讨论这个问题.
他们应该在哪里新装?好吧,我在我的存储库上使用LinqSpecs,并且我的存储库中大多数都有三种方法:
public interface ILinqSpecsRepository<T> { IEnumerable<T> FindAll(Specification<T> specification); IEnumerable<T> FindAll<TRelated>(Specification<T> specification,Expression<Func<T,TRelated>> fetchExpression); T FindOne(Specification<T> specification); }
我的其余查询都是在我的服务层构建的.这使得存储库不会因GetUserByEmail,GetUserById,GetUserByStatus等方法而变得臃肿.
在我的服务中,我新建了我的规范并将它们传递给我的存储库的FindAll或FindOne方法.例如:
public User GetUserByEmail(String email) { var withEmail = new UserByEmail(email); // the specification return userRepository.FindOne(withEmail); }
这是规格:
public class UserByEmail : Specification<User> { private readonly String email; public UserByEmail(String email) { this.email = email; } #region Overrides of Specification<User> public override Expression<Func<User,bool>> IsSatisfiedBy() { return x => x.Email == email; } #endregion }
所以为了回答你的问题,规范在服务层(在我的书中)中是新的.
IMO你不应该向域实体注入任何东西.
那是code smell.我会在那里检查你的代码.规范绝对不需要存储库.
以上是大佬教程为你收集整理的domain-driven-design – 在哪个层中,Specification Pattern对象应该是“new’ed up”?全部内容,希望文章能够帮你解决domain-driven-design – 在哪个层中,Specification Pattern对象应该是“new’ed up”?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。