2

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

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

到目前为止,这是我想出的。在示例中,域对象捕获任务的状态。 DoSomeWorkt1上调用,如果满足某些条件,则创建一个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();
    }
}
4

3 回答 3

3

领域事件可能会做到这一点。它们允许轻松的聚合间通信 - Eric Evans被描述为他希望包含在蓝皮书中的关键元素

域事件允许您描述域中发生的事情,然后域的其他部分可以响应它。例如,OrderConfirmed 可能是一个事件,然后可以在其他上下文中处理它。有人可能必须打包它等等。有人可能必须发送一封电子邮件确认它。然后不同的订阅者负责对该事件作出反应。领域事件以已经发生的事情命名。这些与您向域发出的可能无法发生的请求的命令形成对比。发生了域事件

Jimmy Bogard 在他的DDD 入门系列中解释了用法

于 2013-09-19T08:48:38.377 回答
0

您是否通过事件聚合器模式考虑过事件?

于 2013-09-19T08:43:11.760 回答
0

我不确定该域是否真的需要在这里涉及。

Task在您的无处不在的语言中,一个确实是一个确定的领域概念吗?即使在具有不同用户体验的应用程序(想想移动/平板电脑应用程序)中,关于任务链的逻辑是否会保持相同?

我通常在应用程序级别使用 UnitOfWork,而不是域级别。我更多地将它们视为涵盖用例、用户工作流程的业务交易。

相比之下,我在特定领域服务中编排领域事务,使用常规事务范围而不是 UoW。但即便如此,我的域实体也不知道总体交易。一个实体应该知道域进程的完成状态和链中的下一个对象,这对我来说似乎很奇怪。

对于长期运行的域事务,您可能对Sagas的概念感兴趣。

于 2013-09-19T14:21:44.517 回答