domain-driven-design – 在哪个层中,Specification Pattern对象
所以,我在这里查看了一些关于规范模式的帖子,但还没有找到答案.
我的问题是,在一个n层的架构中,我应该在哪些地方获得“新的”规范? >我可以把它们放在我的服务层(也就是说,应用程序层,它有时被称为……基本上,.aspx代码隐藏的东西会说话),但我觉得通过这样做,我让业务规则漏掉了域名.如果以其他方式(除了服务层)访问域对象,则域对象无法强制执行自己的业务规则. 除此之外,相关规范要求存储库以确定它是否“满意”. 这可能会导致性能问题,尤其是如果我使用构造函数注入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等方法而变得臃肿. 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.我会在那里检查你的代码.规范绝对不需要存储库. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |