在ConfigureServices()
引導我的應用程序期間,我註冊了大多數瞬態和範圍類型的隨.NET Framework附帶的依賴注入框架。但是,我確實有一種類型被註冊爲單例是我的InProcessBus
(我正在使用CQRS樣式的體系結構)。IServiceProvider.GetSingleton在Asp.Net核心解析爲空DI
services.AddSingleton<InProcessBus>(new InProcessBus());
...
services.AddSingleton<ICommandSender>(y => y.GetService<InProcessBus>());
services.AddSingleton<IEventPublisher>(y => y.GetService<InProcessBus>());
正如你所看到的,我正在使用實現工廠函數來實現將在API控制器中使用的實際類型。真正奇怪的是,當控制器加載並且運行時嘗試構造器注入ICommandSender
時,它無法解析並報告錯誤。
如果我檢查serviceCollection
我可以看到,implementationFactory根據ImplementationInstance
屬性下的類型正確註冊。
在Startup
類ConfigureServices()
方法末尾深究並直接解決類型,確認容器正在解析null
。
ServiceLocator.GetService<ICommandSender>() // Is Null
爲什麼一個ImplementationFactory方法針對明確存在於容器中的單例在運行時不能解析?
這很奇怪。儘管你可能想避免使用'y.GetService()'並使用'y.GetRequiredService()',如果它不能被解析,將拋出一個異常,而不是返回null。儘管這可能無法解決您的問題。還有更多嗎?你也不能在'ConfigureServices'裏面解決它,那時容器還沒有建成。 Earlierst點您可以通過'Configure'方法解析服務(如果您使用模板附帶的標準Startup.cs) –
Tseng
您確定要使用內置容器嗎? CQRS架構風格非常強大,因爲它們使得使用裝飾器應用橫切關注變得非常容易。使用內置容器來應用通用裝飾器是不可能的。 – Steven
@Tseng,感謝GetRequiredService提示,顯式異常比null更好。通常無法解決是的,但我使用BuildServiceProvider()來構建我自己的提供程序,以便在出現問題時使用內聯進行測試... –