这不是一个问题,我在我的问题领域。这只是一个思考的练习。
假设我有这样一个简单的计算器:
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);
}
}
}就目前情况而言,没有实体,也没有聚合根。
我相信我有两个选择:
ChangeRequest的类,如下所示:公共类ChangeRequest {公共十进制成本{get;set;}公共listKeyValuePair面额{get;set;} public IEnumerable> AddDenominations(计算器计算器){//添加要在这里列出的分母。}}没有聚合根的聚合是正常的吗?
发布于 2018-01-30 22:16:01
让我们从他的DDD参考书中的Evans引文开始:
有时,服务伪装成模型对象,作为对象出现,除了做一些操作之外,没有任何意义。
记住这一点,我们现在可以查看DDD定义:
聚合:一组关联对象,它们作为一个单元来处理数据更改。服务:作为独立于模型中的接口提供的操作,没有封装状态。
Calculator没有数据,没有状态。因此,没有改变数据的目的。因此,没有汇总。T
操作CalculateDenominationsFor()是CalculatorS接口的一部分,类在模型中是独立的,没有封装状态,它的唯一目的是执行操作,因此它是一种服务。
添加假聚合根,仅仅是因为服务是通过对象公开的,这似乎过于工程化了。
但是,仍然有改进的余地:该方法不依赖于任何对象实例,因此可以将其声明为static。如果该类的所有成员都是静态的,则可以将类本身声明为static。这具有突出该类的真实性质的优点。
发布于 2018-01-30 22:56:17
让我将您的问题改为“应用程序服务直接使用域服务是否常见?”是的,这很常见。
一个活生生的例子是在Vernon的IDDD中验证用户。源代码是这里。
作者对IDDD书中域服务一章中的两种实现进行了深入的比较。第一次尝试是直接在应用服务中使用实体,而不引入域服务。这方面的主要问题是,它使应用程序服务(域对象的客户端)变得不必要复杂,并且不需要了解域对象的内部。
长话短说,在应用程序服务中直接使用域服务在服务查询场景时非常有用。
https://softwareengineering.stackexchange.com/questions/364978
复制相似问题