首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有聚合根的聚合?

没有聚合根的聚合?
EN

Software Engineering用户
提问于 2018-01-30 20:13:52
回答 2查看 1.3K关注 0票数 0

这不是一个问题,我在我的问题领域。这只是一个思考的练习。

假设我有这样一个简单的计算器:

代码语言:javascript
复制
public class Calculator
{
     public IEnumerable<KeyValuePair<int, int>> CalculateDenominationsFor(int cost) 
            {
                var target = cost;
                foreach (var denomination in currency.AvailableDenominations.OrderByDescending(a => a))
                {
                   var numberRequired = target / denomination;
                   if (numberRequired > 0)    
             {
                   yield return new KeyValuePair<int, int>(denomination, numberRequired);
               }
               target = target - (numberRequired * denomination); 
            }
    } 
}

就目前情况而言,没有实体,也没有聚合根。

我相信我有两个选择:

  1. 没有聚合根:让应用程序服务直接调用域服务,即提供成本和接收面额。
  2. 引入聚合根:创建一个名为ChangeRequest的类,如下所示:公共类ChangeRequest {公共十进制成本{get;set;}公共listKeyValuePair面额{get;set;} public IEnumerable> AddDenominations(计算器计算器){//添加要在这里列出的分母。}}

没有聚合根的聚合是正常的吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-01-30 22:16:01

让我们从他的DDD参考书中的Evans引文开始:

有时,服务伪装成模型对象,作为对象出现,除了做一些操作之外,没有任何意义。

记住这一点,我们现在可以查看DDD定义:

聚合:一组关联对象,它们作为一个单元来处理数据更改。服务:作为独立于模型中的接口提供的操作,没有封装状态。

Calculator没有数据,没有状态。因此,没有改变数据的目的。因此,没有汇总。T

操作CalculateDenominationsFor()CalculatorS接口的一部分,类在模型中是独立的,没有封装状态,它的唯一目的是执行操作,因此它是一种服务。

添加假聚合根,仅仅是因为服务是通过对象公开的,这似乎过于工程化了。

但是,仍然有改进的余地:该方法不依赖于任何对象实例,因此可以将其声明为static。如果该类的所有成员都是静态的,则可以将类本身声明为static。这具有突出该类的真实性质的优点。

票数 4
EN

Software Engineering用户

发布于 2018-01-30 22:56:17

让我将您的问题改为“应用程序服务直接使用域服务是否常见?”是的,这很常见。

一个活生生的例子是在Vernon的IDDD中验证用户。源代码是这里

作者对IDDD书中域服务一章中的两种实现进行了深入的比较。第一次尝试是直接在应用服务中使用实体,而不引入域服务。这方面的主要问题是,它使应用程序服务(域对象的客户端)变得不必要复杂,并且不需要了解域对象的内部。

长话短说,在应用程序服务中直接使用域服务在服务查询场景时非常有用。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/364978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档