[英]WebAPI - using Unity with Ioc across multiple projects
我有多個項目的解決方案-類似於以下內容:
以前,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
是依賴於ICustomService
, CustomerService
取決於IDatabaseService
。
還要注意:我會將實現和接口放在相同的項目中。
WebAPI
商業邏輯
數據庫訪問
您走在正確的道路上。 您的控制器應在構造函數中注入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.