在域对象之间进行通信
本文关键字:通信 之间 对象 | 更新日期: 2023-09-27 18:31:58
我正在尝试找到一种可用于在域对象之间进行通信的模式。
如果两个对象的条件都满足,我想提交对域对象的更改。
这就是我到目前为止想出的。 在示例中,域对象捕获任务的状态。 DoSomeWork 在 t1 上调用,如果满足某个条件,则会创建包装完成处理程序的 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();
}
}
域事件可能会做到这一点。它们允许轻松的聚合通信 - 埃里克·埃文斯(Eric Evans)将其描述为他希望被纳入蓝皮书的关键要素
域事件允许您描述域中发生了某些事情,然后域的其他部分可以对其进行响应。 例如,订单确认可能是一个事件,然后它可以在其他上下文中处理。有人可能必须打包它等,有人可能必须发送一封电子邮件确认它。然后,不同的订阅者负责对该事件做出反应。域事件以已发生的事情命名。这些命令与您向域发出的请求形成鲜明对比,这些请求可能无法发生。发生了域事件
Jimmy Bogard 在他的 DDD 入门系列中解释了用法
您是否考虑过通过事件聚合器模式的事件?
我不确定该域是否真的需要在此处参与。
在您的通用语言中,Task
真的是一个已识别的领域概念吗?即使在具有不同用户体验的应用程序(例如移动/平板电脑应用程序)中,有关任务链的逻辑是否保持不变?
我通常在应用程序级别而不是域级别使用UnitOfWork。我更多地将它们视为涵盖用例(用户工作流程)的业务交易。
相比之下,我在特定域服务中编排域事务,使用常规事务范围而不是 UoW 的事务范围。但即便如此,我的域实体也不知道总体事务。对我来说,一个实体应该知道域进程的完成状态和链中的下一个对象,这似乎很奇怪。
对于长时间运行的域事务,您可能对 Sagas 的概念感兴趣。