2017-08-10 70 views
1

我新的領域驅動設計,並努力學習,在我的項目中實現共享實體。我的項目結構到目前爲止與此類似,領域驅動設計 - 跨越限界上下文

修的文件夾
    Maintainance.Data(類 庫)
    Maintainance.Domain(類庫)
    Maintainance.Domin.Tests(測試項目)

MovieBooking文件夾
    MovieBooking.Data(類 庫)
    MovieBooking.Domain(類庫)
    MovieBooking.Domain.Tests(測試項目)

SharedKernel
   共同的東西

Web應用程序
    MovieBooking MVC的Web 應用(其具有參考MovieBooking域)

在修的boundned方面我保持所有的CRUD,對於比如說電影,鄉村,類別,在修的的DbContext子目錄實體GETALL類的東西。 現在在MovieBooing數據層我還需要使用這個實體(主要是爲了顯示名稱或下拉鑑於罷了,那種子集所需的 - 並不是所有的屬性需要,只有少數像編號,名稱)

有幾種方法我可以訪問此實體在電影訂票界上下文

  1. 通過Web服務 - 需要爲喜歡電影,鄉村,類別,子目錄常見的實體網絡API和調用Web項目的Web API(填寫下拉框或獲取從實體名稱)

  2. 通過參考上下文(單獨的DbContext) - 需要配置Dbset,然後將數據庫視圖(僅需要字段)映射到Dbset 示例:

    modelBuilder.Entity()。ToTable(ViewName);

對於(1),它可以是長期的implmentation解決方案,我
(2)我要創建視圖(只有少數屬性)爲每個需要的表,它會增加我的意見數我的DB,因爲我有企業級應用程序。

是否有其他方法可以讓我做到這一點?我在DDD中找不到任何東西?

回答

1

選項2,而這將節省您的時間,實際上是從DDD角度來看,非常糟糕的主意,因爲它允許對違規行爲的交易邊界保證每個聚集是爲了執行\代表。

選項1似乎是一個更好的選擇,雖然根據您提出的解決方案的簡要描述,仍然有相當多的解釋餘地。如果我理解正確,一般建議遵循以下內容:

  1. 不要直接暴露您的聚合狀態,因爲這會暴露內部並增加耦合。簡單地創建有意義的DTO,並使用Automapper之類的東西將您的聚合映射到DTO的easilly上,然後輕鬆地將其發送出去。
  2. 在您的客戶端中有DTO定義的副本。這將減少耦合並允許更簡單的部署。

強烈推薦閱讀DDD orange book但我不得不說,我不記得特別在其本章節討論。閱讀六角形建築,你也會受益匪淺(我會在橙皮書中搜索這個術語以找到關於你的問題的更多信息)。

實際上我可以想到一個選擇:如果您從BC發佈活動,您可以創建一個工作流將域事件翻譯爲「公共」事件,然後在另一個BC中監聽公共事件你需要存儲你需要的地方的數據。根據您的基礎設施,這種困難從非常容易到相當成問題。請注意,重複使用域名事件向其他BC傳輸數據並不是一個好主意,因爲這樣可以將兩個BC聯繫起來。

我希望這會有所幫助。如果我對這個問題的理解不夠好,請不要猶豫。

+0

謝謝您的回覆。我打算看看你建議的這本書(橙色)。 對於點(2) - 配置Dbset,然後將一個數據庫視圖(僅需要字段)映射到Dbset,我已經從 轉到本文https://msdn.microsoft.com/en-us/magazine/jj883952 .aspx以及來自pluralsight的課程:企業中的實體框架 您對選項2的看法是否真實?如果我們不在同一條路上,請提出建議。 我覺得我有點失落,在黑暗中尋找一些光:) :)可能是這本書成爲光線對我來說! – vibs

+0

關鍵是業務邏輯的隔離,而您參考的文章實際上討論將大的dbcontext分解爲更小的_independent_,這與我上面的建議完全一致。共享表允許一個BC改變另一個的狀態,這實際上違反了保證另一個BC的聚合內的事務一致性的可能性。 – SKleanthous

+0

爲了進一步解釋,你可以共享db(但不是db上下文),並且在每個BC中都有單獨的數據庫上下文,而不同的BC中的數據庫上下文將無法訪問相同的表。如果你沒有按順序進行事件採購,這是非常好的,但我發現如果可能的話,最好還要隔離db,這有助於能夠獨立部署每個服務而不會影響其他服務。 – SKleanthous