【发布时间】:2011-04-16 07:22:48
【问题描述】:
给定:
- 您拥有一个包含表示层、业务层和数据层的架构。
- 您正在应用领域驱动设计。
- 您正在使用可让您创建面向对象查询的对象关系映射器(例如,可让您创建 HQL 查询的 NHibernate)。
问题:
你应该把面向对象的查询放到哪一层?
我的想法:
我认为将它们放入表示层通常是没有意义的。但是不知道是放到业务层还是数据层。
示例(NHibernate):
假设您的业务逻辑需要一些方法 GetCustomersPossiblyInterestedIn(Product p)。然后,您可以创建一个复杂的 HQL 查询,用于选择客户已经购买了与 p 属于同一类别的产品的客户对象。
论据 a)
一方面,我会说这个查询显然是业务逻辑,因为根据客户是否购买了同一类别的产品而将其视为可能对产品感兴趣的决定是一个业务决策。不妨选择在同一类别中以相似价格购买过多个产品的客户,例如
论据 b)
另一方面,业务层不应该依赖于数据层,所以直接在业务层使用NHibernate敲响了警钟。
可能的解决方案 1)
创建您在业务层中使用的您自己的面向对象的查询语言,并在数据层中转换为 HQL。 我认为这会导致很多开销。如果您使用基于查询对象的查询语言而不是已解析的查询语言,您可能会付出一些努力,但我的反对意见仍然适用。
可能的解决方案 2)
在业务层直接使用 NHibernate 是可以的,因为 NHibernate 能够提供 HQL、ISession 等的抽象级别适合业务层。无需包装。
你怎么看?
编辑:
有关密切相关的讨论,请参阅 Ayende Rahien 的 "Repository is the new Singleton" 和 "The false myth of encapsulating data access in the DAL"。
【问题讨论】:
-
您是否将规范模式视为解决方案 3?
-
到目前为止,没有。不过谢谢,我去看看。
标签: nhibernate hql ddd-repositories 3-tier