2017-01-10 32 views
0

我有多個項目的解決方案 - 類似如下:的WebAPI - 使用Unity國際奧委會在多個項目

  • 的WebAPI
    • ICustomerService.cs
  • 業務邏輯
    • CustomerService.cs
    • 個IDatabaseService.cs
  • 數據庫訪問
    • DatabaseService.cs

以前的的WebAPI項目有一個參考的業務邏輯,那麼只好數據庫訪問的參考。我試圖反轉這種邏輯。

目前,我在我的WebAPI項目中使用Unity來解析來自業務邏輯層的實現的接口,但是一旦我已經顛倒了我的邏輯,以便業務邏輯層具有對WebAPI層的引用,那麼Unity註冊不會「沒有一個循環引用科技工作:

var container = new UnityContainer(); 
container.RegisterType<ICustomerService, CustomerService>(); 
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 

當我嘗試註冊我的類型,在ICustomerService住在頂層的項目,爲CustomerService是看不見它。

我已閱讀關於有一個單獨的項目來容納統一配置,但也會創建一個循環參考。我該如何做這項工作?

回答

0

爲什麼你想要反轉?在我看來,這是唯一的方法。 WebAPI項目是主要入口(如果它是自託管的,它將包含一個programs.cs)。該項目還將包含用於設置依賴注入和解析類型的組合根(這由WebAPI處理)。另見Composition Root。你能向我解釋這樣做的好處嗎?

另外請注意,分散IoC容器交叉項目是不好的做法。只有合成根(主)應該知道Unity正在被使用的事實。同時避免使用ServiceLocator模式。

不同項目中的對象應該通過例如構造函數來引用/依賴。

如果您仔細考慮,Controller取決於ICustomService,CustomerService取決於IDatabaseService

另外一個說明:我會把實施和接口放在同一個項目中。

的WebAPI

  • 控制器

業務邏輯

  • ICustomerService.cs
  • CustomerService.cs

數據庫訪問

  • IDatabaseService.cs
  • DatabaseService.cs
+0

感謝您的評論,我想這樣做的原因是爲了支持業務邏輯和層下的靈活性。我把這個放在一個正在改變的ERP系統之上,這兩個系統將平行運行一段時間。我希望依賴注入器是智能的,這樣服務就可以從一個系統移動到另一個系統,我可以將邏輯置於「使用CustomerServiceA.cs」和「使用CustomerServiceB.cs」的位置 - 也許我正在考慮這個問題錯誤的方法? –

+0

因此,您希望能夠在不重新編譯的情況下更改業務邏輯層? – Michael

+0

不久將有第二個業務邏輯和數據庫訪問層,我希望能夠選擇哪一個我想以編程方式使用,但webapi不應該知道它將使用哪個實現 –

0

你在正確的道路上。您的控制器應該在構造函數中注入icustomerservice實現,並且該服務應該在其構造函數中注入idatabaseservice。

public FooController(ICustomerService svc) 
... 
public CustomerService(IDatabaseService db) 
... 

並添加數據庫DI配置

container.RegisterType<IDatabaseService, DatabaseService>(); 
container.RegisterType<ICustomerService, CustomerService>(); 

當你準備使用新的實現,只是改變了參考的配置實例的新的實現。

接口應該一起在一個項目中,並且實現應該一起在一個項目中。新舊實現應該共享一個通用接口。