在域对象之间进行通信

本文关键字:通信 之间 对象 | 更新日期: 2023-09-27 18:31:58

我正在尝试找到一种可用于在域对象之间进行通信的模式。

如果两个对象的条件都满足,我想提交对域对象的更改。

这就是我到目前为止想出的。 在示例中,域对象捕获任务的状态。 DoSomeWorkt1 上调用,如果满足某个条件,则会创建包装完成处理程序的 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 的概念感兴趣。