鉴于:
- 你有一个包含表示层、业务层和数据层的架构。
- 您正在应用领域驱动设计。
- 您正在使用一个对象关系映射器,它可以让您创建面向对象的查询(例如,NHibernate,它可以让您创建 HQL 查询)。
问题:
您应该将面向对象的查询放在哪一层?
我的想法:
我认为将它们放入表示层通常是没有意义的。但我不知道是否将它们放入业务层或数据层。
示例(NHibernate):
假设您的业务逻辑需要一些方法 GetCustomersPossiblyInterestedIn(Product p)。然后,您可以创建一个复杂的 HQL 查询,该查询选择客户已经购买了与 p 属于同一类别的产品的客户对象。
论点 a)
一方面,我会说这个查询显然是业务逻辑,因为根据客户是否购买了同一类别的产品而将其视为可能对产品感兴趣的决定是一个业务决策。您不妨选择在同一类别中以相似价格购买过多个产品的客户,例如
论点 b)
另一方面,业务层不应该依赖于数据层,所以直接在业务层使用NHibernate敲响了警钟。
可能的解决方案 1)
创建您自己在业务层中使用的面向对象的查询语言,并在数据层中转换为 HQL。我认为这会导致很多开销。如果您使用基于查询对象的查询语言而不是解析的查询语言,您可能会付出一些努力,但我的反对意见仍然适用。
可能的解决方案2)
在业务层直接使用NHibernate 是可以的,因为NHibernate 能够提供HQL、ISession 等的抽象级别适合业务层。没有必要包装它。
你怎么看?
编辑:
有关密切相关的讨论,请参阅Ayende Rahien 的“Repository is the new Singleton”和“在 DAL 中封装数据访问的错误神话” 。