2011-02-11 29 views
1

最近,我在想如何使用消息來實現域對象協作。現在我有一些想法:基於消息的域對象協作

  1. 每個域對象將實現一個接口,如果它想要響應一個消息;
  2. 每個域對象將不依賴於任何其他域對象,這意味着我們不會有Model.OtherModel關係;
  3. 每個域對象只做自己修改的東西;
  4. 每個域對象都可以發送一條消息,並且該消息將由任何其他關心此消息的域對象接收;

域對象之間協作的唯一方式是消息,一個域對象只要需要就可以發送任何消息或接收任何消息。

當我學習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. 
    } 
} 

這就是我的想法。希望聽到你的話。

回答