2012-11-12 57 views
1

所以我的問題是非常與此相關的一個:Entity persitance inside Domain Events using a repository and Entity Framework?如何絲域事件處理程序中的多層應用

編輯:一個的話題更好的討論也正在於此:Where to raise persistence-dependent domain events - service, repository, or UI?

然而,我的問題是相當簡單和技術性的,假設我採取正確的方法。

讓我們假設我有以下項目:

MyDomainLayer -> very simple classes, Persitence Ignorance, a.k.a POCOs 
MyInfrastructureLayer -> includes code for repositories, Entity Framework 
MyApplicationLayer -> includes ASP.Net MVC controllers 
MyServicesLayer -> WCF-related code 
MyWebApplication -> ASP.Net MVC (Views, Scripts, etc) 

當引發事件(例如組成員已被授予), 那麼兩件事情應該做的(在兩個不同的層):

  1. 留存數據(插入一個數據庫中的新組成員記錄)
  2. 創造所涉及的用戶發送通知(UI相關的)

我要最後引用我在介紹中寫了一個簡單的例子:

領域層具有下面的代碼:

public void ChangeStatus(OrderStatus status) 
{ 
    // change status 
    this.Status = status; 
    DomainEvent.Raise(new OrderStatusChanged { OrderId = Id, Status = status }); 
} 

假設排氣處理程序是在MyApplicationLayer(以能夠與服務層交談)。 它有以下代碼:

DomainEvent.Register<OrderStatusChanged>(x => orderStatusChanged = x); 

線路是如何發生的?我想是與結構圖,但這個導入代碼看起來如何?

回答

4

首先,你的分層不完全正確。更正:

應用程序層 - ASP.NET MVC控制器通常被認爲是在應用程序層和HTTP/HTML之間形成適配器。因此,控制器本身不是應用程序層的一部分。應用層屬於應用服務。

MyServicesLayer - 與WCF相關的代碼。 WCF實現的服務是由Dennis Traub引用的六角形體系結構中的適配器。

MyWebApplication - ASP.Net MVC(視圖,腳本等)。再次,這形成了六角形結構中的適配器。MVC控制器也屬於這裏 - 它們是這個適配器的實現細節。該層與使用WCF實現的服務層非常相似。

接下來,您將描述2個事件應該發生的事件。持久性通常是通過在一個事務中提交一個工作單元來實現的,而不是作爲對事件做出響應的處理程序。此外,應在持久性完成後(換句話說,在事務提交後)進行通知。這最好是以最終一致的方式完成,而這種方式不在產生域名事件的工作單元之外。

有關如何實施域事件pub/sub系統的細節,請看看here

+0

榮譽eulerfx和丹尼斯,非常感謝你,這是一個架構的速成課程。我想我有一些功課要做,並閱讀這個六角形建築。非常感謝。 –

3

我的第一個建議,擺脫圖層的概念,並讓自己熟悉Hexagonal Architecture a.k.a. Ports and Adapters的概念。

使用這種方法可以更容易地理解領域模型如何獨立於任何周圍的問題。基本上這是在架構層面上的面向對象。層是程序性的。

針對您的特定問題,您可能會創建一個包含將事件投影到數據庫中的事件處理程序的項目。這些處理程序可以直接訪問數據庫或通過ORM。您可能不需要任何存儲庫,因爲事件應該包含所需的所有信息。

+0

非常感謝丹尼斯,它看起來非常有趣,我希望我能給你一個投票,不幸的是我不能(新手在這裏)。但我更新了我的問題,也許你能幫助我? –

+0

我希望不是太晚,謝謝你的評論:) –

+0

@JorgeAlvarado它永遠不會太晚了謝謝:) –

相關問題