最近,我在想如何使用消息來實現域對象協作。現在我有一些想法:基於消息的域對象協作
- 每個域對象將實現一個接口,如果它想要響應一個消息;
- 每個域對象將不依賴於任何其他域對象,這意味着我們不會有Model.OtherModel關係;
- 每個域對象只做自己修改的東西;
- 每個域對象都可以發送一條消息,並且該消息將由任何其他關心此消息的域對象接收;
域對象之間協作的唯一方式是消息,一個域對象只要需要就可以發送任何消息或接收任何消息。
當我學習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.
}
}
這就是我的想法。希望聽到你的話。