2016-03-14 51 views
1

我有Domain組裝和裝配SqlServerRepository我應該在哪裏把接口和實現

SqlServerRepository組件具有上Domain組件的引用,Domain組件不會對其它組件的參考。

Domain程序集具有接口IRepository(和其他存儲庫),因爲域邏輯僅適用於接口類型,不考慮具體類型。 (其包含在Domain組件中)。

而且這沒關係,我可以嘲笑IRepository,可以使用OracleRepository執行和其他...

但是我覺得我有一些架構問題...

  1. SqlServerRepository不能沒有工作Domain裝配
  2. 在另一方面,如果我把接口在SqlServerRepository裝配,Domain不會沒有SqlServerRepository裝配工作,如果我創建OracleServerRepository組裝,我必須ū SE SqlServerRepository過,因爲我把接口的SqlServerRepositoryDomain alredy使用它們。
  3. 應該在哪裏我的數據庫對象映射到域?在SqlServerRepositoryDomain程序集中?

我想過只包含接口組件,以及DomainSqlServerRepository參考它,但我認爲這是開銷爲我的項目(微服務)

所以,我必須做什麼?

+1

我認爲一個簡單包含必要'接口'的普通項目將是最好的方法。這將允許您只依賴'Domain'中的通用項目,反之則來自'Repository'。從我的問題中可以看出,這將從存儲庫邏輯中完全分離您的域邏輯,儘管這取決於是否希望管理另一個項目的開銷。但我會說,這個開銷值得完全解耦。 –

+0

我通常有一個「Core-Contract」/「Core-Implementation」項目對,並使用一個DI工具將它們結合在一起。我的目標是避免實施項目中的依賴關係。這保持了很乾淨。 – Enigmativity

+0

如果您真的想將SqlServerRepository從IRepository中解耦,您可以刪除依賴項並在兩者之間使用[adapter](https://en.wikipedia.org/wiki/Adapter_pattern)。然而,這是矯枉過正,我肯定會*不推薦它。 [由jgauffin回答](http://stackoverflow.com/a/35986972/446278)就好了。 – proskor

回答

4

儲存庫接口屬於域中(或者更確切地說,在您的服務,但它們通常是域的一部分)。

的原因是倉庫的合同中創建並從功能,域需求驅動。沒有這個域,你就沒有任何存儲庫。

SqlServerRepository離不開域裝配

正確工作。正如我上面所述。如果不具備該域所需的功能,則不會有SqlServerRepository

我應該在哪裏地圖數據庫對象的域名?在SqlServerRepositoryDomain程序集中?

在存儲庫程序集中,因爲它是特定數據層抽象的實現細節。如果你把它們放在域中,那麼這個域將被迫知道你正在使用的每個持久層(如oracle,sqlserver,文件或其他)的實現細節。

沒有說SQL Server和Oracle應該使用相同的數據庫模式持久化信息。表,視圖等可能會有所不同,具體取決於數據庫引擎的優點/缺點。

0

我建議你使用端口和適配器[六角形體系結構]實現東西。以下程序集可以用於微服務:

  1. Core.Domain:您可以將所有域對象放在此處。
  2. Common.ServiceContracts:它可以包含不同服務的所有服務合同。
  3. MyService:它有服務實現類。它也將具有基礎設施的接口。基礎架構可以是數據庫,日誌記錄等。您可以公開接口以將域轉換爲基礎結構對象IDomain1Mapper。
  4. 基礎設施:它可以具有像SQLDomain1Mapper,OracleDomain1Mapper等類。他們都將實現IDomain1Mapper。其他域類的情況也是如此。

MyService程序集將引用Common.ServiceContracts,Infrastructure和Core.Domain。

您可以根據需要模擬MyService程序集中的任何存儲庫/域。服務使用者可以使用MyService程序集。

相關問題