我正在尝试找到一种可用于在域对象之间进行通信的模式。
如果满足两个对象中的条件,我想提交对域对象的更改。
这是我到目前为止所提出的。在该示例中,域对象捕获任务的状态。在 t1 上调用 DoSomeWork ,如果满足某些条件,则创建包含完成处理程序的 UnitOfWork 。 UnitOfWork 传递给 t2 ,如果条件正确,则完成工作单元。
var t1 = new Task();
var t2 = new Task();
var unitOfWork = t1.DoSomeWork();
t2.DoSomeOtherWork(unitOfWork);
Assert.IsTrue(t1.WorkComplete);
public class Task
{
public Boolean WorkComplete { get; private set; }
public UnitOfWork DoSomeWork()
{
UnitOfWork result = null;
if (/* Some condition */)
{
result = new UnitOfWork(() => this.WorkComplete = true);
}
return result;
}
public void DoSomeOtherWork(UnitOfWork unitOfWork)
{
if (/* Some condition */)
{
unitOfWork.Complete();
}
}
}
public class UnitOfWork
{
protected Action Handler { get; private set; }
public UnitOfWork(Action handler)
{
this.Handler = handler;
}
public void Complete()
{
this.Handler.Invoke();
}
}
答案 0 :(得分:3)
Domain events可能会这样做。它们允许轻松的集合间沟通 - Eric Evans被描述为他希望被列入蓝皮书的关键要素
域事件允许您描述域中发生的事情,然后域的其他部分可以响应它。例如。 OrderConfirmed可以是一个事件,然后它可以被处理为其他上下文中的进程。有人可能需要打包等等。有人可能需要发送确认电子邮件。然后,不同的订户负责对该事件作出反应。域事件以已发生的事件命名。这些命令与您对域可能无法发生的请求进行对比。域事件已发生
Jimmy Bogard在他的DDD primer series
中解释了用法答案 1 :(得分:0)
您是否通过Event Aggregator模式考虑了事件?
答案 2 :(得分:0)
我不确定这个域是否真的需要参与。
Task
是否真的是您无处不在的语言中已识别的域名概念?即使在具有不同用户体验的应用程序(想想移动/平板电脑应用程序)中,关于任务链的逻辑是否仍然相同?
我通常在应用程序级别使用UnitOfWork,而不是域级别。我将它们视为涵盖用例,用户工作流程的业务事务。
相比之下,我使用常规事务范围而不是UoW来协调特定域服务中的域事务。但即便如此,我的域实体也不了解总体交易。对我来说,一个实体应该知道域进程的完成状态和链中的下一个对象,这似乎很奇怪。
对于长期运行的域事务,您可能对Sagas的概念感兴趣。