最近,我在考虑如何使用消息来实现域对象协作。现在我有一些想法:
总的来说,域对象之间唯一的协作方式是消息,只要需要,一个域对象就可以发送任何消息或接收任何消息。
当我学习Evans的DDD时,我发现他定义了域中的聚合概念,我认为聚合是静态的,不适合对象交互,他只专注于对象的静态结构或对象之间的关系。在现实世界中,对象将使用消息进行交互,而不是通过相互引用或聚合其他对象。在我看来,所有对象都是相同的,这意味着它们不依赖于任何其他对象。 关于如何实现发送消息或接收消息的功能,我认为我们可以创建一个专门用于域对象协作的EventBus框架。我们可以将事件类型映射到字典中的订阅者类型。关键是事件类型,值是订户类型列表。当引发一个事件时,我们可以找到相应的订阅者类型,并从数据持久性中获取所有订阅者域对象,然后在每个订阅者上调用相应的句柄方法。
例如:
public class EventA : IEvent { }
public class EventB : IEvent { }
public class EventC : IEvent { }
public class ExampleDomainObject : Entity<Guid>{
public void MethodToRaiseAnExampleEvent()
{
RaiseEvent(new EventC());
}
}
public class A : Entity<Guid>, IEventHandler<EventB>, IEventHandler<EventC> {
public void Handle(EventB evnt)
{
//Response for EventB.
}
public void Handle(EventC evnt)
{
//Response for EventC.
}
}
public class B : IEventHandler<EventA>, IEventHandler<EventC> {
public void Handle(EventA evnt)
{
//Response for EventA.
}
public void Handle(EventC evnt)
{
//Response for EventC.
}
}
这是我的想法。希望听到你的话。
答案 0 :(得分:2)
您听说过event sourcing或CQRS吗?
听起来这就是你的思想方向。
那里有很多great info。关于CQRS和Domain Events,messaging-based domains。
的许多好博客文章有些example implementations可用,并且有helpful and active community可以讨论实施细节。