【问题标题】:DDD Entity Framework Repository Return Complex TypeDDD 实体框架存储库返回复杂类型
【发布时间】:2014-01-21 17:01:39
【问题描述】:

我有一个名为 LeadRepository 的存储库,它返回一个名为 Lead 的模型,它是一个人。

我拥有的 UI 是一个显示以下统计信息的仪表板。他们都是潜在客户,但处于不同的状态。

潜在客户总数:52

已分配:49

未分配:3

联系人:49

未联系:0

我正在使用存储过程来查询数据库。所以我没有使用延迟加载来计算动态计数。

我想过以下两种可能的解决方案,但都觉得不太对。

  1. 使用 LeadRepository,但有一个名为 GetStats() 的方法,该方法返回复杂类型。这与 agg 根 Lead 没有任何关联。只是一堆具有不同计数的属性。

  2. 创建一个 LeadStatsRepository,但这并不是真正的聚合根,因为它没有 id。它只是一组数据。

如果有人有任何建议,那就太好了。

【问题讨论】:

    标签: asp.net-mvc entity-framework domain-driven-design ddd-repositories aggregateroot


    【解决方案1】:

    存储库用于聚合根。您所追求的是读取模型和专用查询对象。

    【讨论】:

    • 我是否需要创建一个 LeadQuery 类,该类有一个名为 GetStats() 的方法,其中包含我的查询?所以我基本上调用了返回我的读取模型的查询类,而不是返回 agg 根的存储库类?
    • 取决于你的口味。导入位是您将查询从存储库和聚合根中移开。我使用像 GetLeadStatisitcs 这样的 Query 对象,这些对象由 IHandleQuery 的实现处理。
    • 这篇文章让我在我的博客上写了更详细的解释:jefclaes.be/2014/01/repositories-where-did-we-go-wrong_26.html
    【解决方案2】:

    最好通过服务处理统计信息。从 Evans 的 DDD 来看,一个好的 Service 具有以下特点:

    • 该操作与不是实体或值对象自然组成部分的域概念相关
    • 接口是根据领域模型中的其他元素定义的
    • 操作是无状态的

    Stats 与域对象相关,但实际上不是实体或值对象的一部分。它们可能没有根据其他元素来定义,但这是一种可能性。没有任何状态具有统计数据,即使随着时间的推移保持它们也不是真正的有状态的。

    【讨论】:

    • 我现在有一个名为 LeadService 的服务,它是一个应用程序服务。我不想在同一个服务方法中使用像 LeadRepository.GetTotal() 和 LeadRepository.GetAllAssigned() 这样的以下内容,因为它会触发对数据库的多个查询。这就是为什么我创建了一个存储过程来触发 1 个查询。您的评论是指应用程序服务还是域服务?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多