【问题标题】:In a Domain object how do I get a filtered set of related child entities without accessing repository?在域对象中,如何在不访问存储库的情况下获得一组过滤的相关子实体?
【发布时间】:2009-08-27 14:05:53
【问题描述】:

我正在使用 NHibernate,并设置了一对一映射。让我们称之为客户 - >订单 这一切都有效,我可以为客户获得所有订单。

现在,我想过滤这些订单,假设我只想要运行时间确定日期之间的订单。

public class Customer
{
    ...

    // mapped from NHibernate mapping file
    public IList<Orders>Orders {get; set; }

    // get a filtered list of orders
    public IList<Orders>GetOrders(DateTime start, DateTime end) { ... }

    ...
}

所以我可以枚举所有订单并选择我想要的订单,但我想将过滤推迟到数据库中,因为订单数量可能非常大。

问题是,我可以在带有过滤器的映射文件中执行此操作吗? 还是我需要在存储库上创建一个方法来执行此操作并从我的域对象访问该方法?

也欢迎任何其他建议....

非常感谢

RR

【问题讨论】:

  • 好的,所以看起来我可能需要根据这个答案基于接口实现服务类:stackoverflow.com/questions/521640/… 问题是,我是否在域对象的构造函数中注入服务依赖项?还有其他/更好的方法吗?

标签: nhibernate-mapping repository domain-driven-design


【解决方案1】:

您的客户作为订单的聚合根真的有意义吗?这是一个只有你才能做出的决定,但我可能不会采取这种方式。相反,我会将订单视为其自己的聚合根,并带有指向客户的链接,因为我想象有很多屏幕您直接关心订单。

如果一个 Order 成为一个聚合根,那么它就获得了自己的存储库和直接查询的能力。此时,您只需编写一个满足您需求的查询。

【讨论】:

  • 感谢 Shane 的回答,但我需要更笼统地考虑这一点。具体来说,如果我需要获取任何域中子对象的过滤列表,那么最佳实践是什么?住酒店房间。一年内它将有 365 个“可用性”对象,但我只想要一周的对象。在代码中循环?或者如何通过具有 Nhibernate/Repository 模式的数据库来做到这一点。
  • 实际上,现在我查看了您的问题,似乎您可能正在破坏命令查询分离 (CQS)。应该对您的域模型应用诸如“使用这些参数预订酒店房间”之类的命令(不要忘记“告诉..不要问”),但应该有另一种查询机制,例如“显示所有可用房间” "。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2021-07-29
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多