【问题标题】:Can Aggregate root entity calls Repository可以聚合根实体调用存储库
【发布时间】:2010-12-07 17:35:43
【问题描述】:

Aggregate 根实体是否有可能拥有调用 Repository 的方法?

我知道不应该,但想得到确认,因为 Eric 的书也没有说清楚:(

我在哪里可以获得域驱动设计的单元测试示例?

【问题讨论】:

标签: domain-driven-design


【解决方案1】:

可以吗? -是的。

应该吗? -没有。

然而,所有答案都是上下文相关的,您不提供自己的答案。

一般建议是寻找“服务”或“规范”类型。

【讨论】:

  • 感谢 Martin 的回复我也认为 Enities 不应该调用存储库,但在一本书中作者给出了他从 Person 实体调用存储库的示例,这本书是“企业应用程序架构的模式”马丁·福勒。请指教
【解决方案2】:

这是一个宗教问题。 有些人认为这样做没有问题,而另一些人可能认为这样做是异端。

虽然我通常总是让我的存储库远离我的域模型(并且有一个上游服务对象处理存储库),但我有一个项目“要求”具有可从域模型访问的存储库。 这是由于域对象需要根据业务逻辑检索特定数据 => 使用规范对象/Linq to nHibernate(如何过滤属于该域对象的数据的责任和知识)和/或性能原因。

关于这样做的一个警告是如何获取对域对象的存储库的引用 - 在这种情况下,我使用了带有 IOC 工具的构造函数注入。

您是否应该这样做实际上取决于您使用的解决方案/用例/技术等...

【讨论】:

    【解决方案3】:

    行为是-什么-它-是。 Eric 从名为“QueryService”的经纪账户实体调用类似存储库的实用程序。他提到这对于一个真正的项目来说不是一个好的设计。那你怎么办?

    public class Clerk
    {
        public Clerk()
        {
        }
    
        //Store Report in Database
        public void File(Report);
        {
            ReportRepository.Add(Report);
        }
    }
    

    您可以这样做,但最好告诉 Clerk 使用哪个存储库。

    public class Clerk
    {
        private IReportRepository _reportRepository;
    
        public Clerk(IReportRepository ReportRepository)
        {
            this._reportRepository = ReportRepository
        }
    
        //Store Report in Database
        public void File(Report);
        {
            this._reportRepository.Add(Report);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 2021-05-30
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多