![](/img/trans.png)
[英]Injecting Simple Injector components into IHostedService with ASP.NET Core 2.0
[英]Cannot resolve ILogger<T> Simple Injector ASP.NET Core 2.0
我們在ASP.NET Core應用程序中使用Simple Injector。 最近我們決定使用Serilog進行日志記錄。
配置在Program.cs中完成,如其文檔中所述 。 然后,為了使Simple Injector能夠解決ILoggerFactory
我做了類似這樣的事情:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
// As per my understanding, we force SimpleInjector to use
// ILoggerFactory registration from IApplicationBuilder
container.CrossWire<ILoggerFactory>(app)
}
之后, ILoggerFactory
可以在我們使用它的任何地方注入。 它工作正常(創建新實例ILogger<T>
)。
但這很煩人,每次我們需要時都要從工廠創建實例。 最好直接在依賴類中使用ILogger<T>
,而不是ILoggerFactory
。
那么,如何在下面的情況下注冊ILogger<T>
以獲取實例?
public class HelloWorldController : Controller
{
public HelloWorldController(ILogger<HelloWorldController> logger)
{
// ...
}
}
雖然Alsami的答案可行,但請使用以下注冊:
container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);
// This next call is not required if you are already calling AutoCrossWireAspNetComponents
container.CrossWire<ILoggerFactory>(app);
這個確切的例子顯示在文檔中 。
該登記允許注入Logger<T>
成非通用 ILogger
構造器參數,其中T
的Logger<T>
成為記錄器被注入型。 換句話說,當HelloWorldController
依賴於ILogger
,它將被注入一個Logger<HelloWorldController>
。 這意味着您可以將HelloWorldController
簡化為以下內容:
public class HelloWorldController : Controller
{
public HelloWorldController(ILogger logger)
{
// ...
}
}
通過讓您的應用程序組件依賴ILogger
而不是ILogger<T>
您:
您還必須將logger iteself注冊為泛型類型。 我不知道簡單的注入器,但這應該是正確的語法。
container.Register(typeof(ILogger<>), typeof(Logger<>), Lifestyle.Singleton);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.