簡體   English   中英

無法解決ILogger <T> 簡單的注入器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構造器參數,其中TLogger<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.

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