基于消息的域对象协作

时间:2011-02-11 01:53:51

标签: domain-driven-design

最近,我在考虑如何使用消息来实现域对象协作。现在我有一些想法:

  1. 如果想要响应一条消息,每个域对象都将实现一个接口;
  2. 每个域对象都不依赖于任何其他域对象,这意味着我们将不具有Model.OtherModel关系;
  3. 每个域对象只执行仅修改自身的内容;
  4. 每个域对象都可以发送一条消息,任何其他关心此消息的域对象都会收到此消息;
  5. 总的来说,域对象之间唯一的协作方式是消息,只要需要,一个域对象就可以发送任何消息或接收任何消息。

    当我学习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.
        }
    }
    

    这是我的想法。希望听到你的话。

1 个答案:

答案 0 :(得分:2)

您听说过event sourcingCQRS吗?

听起来这就是你的思想方向。

那里有很多great info。关于CQRSDomain Eventsmessaging-based domains

的许多好博客文章

有些example implementations可用,并且有helpful and active community可以讨论实施细节。