簡體   English   中英

WebAPI-在多個項目中將Unity與Ioc結合使用

[英]WebAPI - using Unity with Ioc across multiple projects

我有多個項目的解決方案-類似於以下內容:

  • 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對它不可見。

我已經讀過關於有一個單獨的項目來容納統一配置的信息,但這也會創建一個循環引用。 我該如何進行這項工作?

你為什么要反轉它? 在我看來,這是唯一的方法。 WebAPI項目是主要入口(如果它是自托管的,它將包含一個program.cs)。 該項目還將包含您的合成根目錄,用於設置依賴項注入和解析類型(由WebAPI處理)。 另請參見“ 合成根” 您能告訴我這樣做的好處嗎?

還應注意,分散IoC容器跨項目是一種不好的做法。 只有組合根目錄(主目錄)才應該知道使用Unity的事實。 還要避免使用ServiceLocator模式。

通過例如構造函數,不同項目中的對象應該僅具有引用/依賴關系。

如果你仔細想想這樣的Controller是依賴於ICustomServiceCustomerService取決於IDatabaseService

還要注意:我會將實現和接口放在相同的項目中。

WebAPI

  • 控制者

商業邏輯

  • ICustomerService.cs
  • CustomerService.cs

數據庫訪問

  • IDatabaseService.cs
  • DatabaseService.cs

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

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

並添加數據庫DI配置

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

准備使用新實現時,只需在配置中更改引用即可實例化新實現。

接口應該在項目中在一起,而實現應該在項目中在一起。 新的和舊的實現應共享一個公共接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM