将现有的IServiceCollection和ILoggerFactory传递给.NET Core 2中的Startup

时间:2017-11-10 09:26:34

标签: c# dependency-injection asp.net-core asp.net-core-2.0

我有一个托管Web API的控制台应用程序。现在,我想将已配置的IServiceCollectionILoggerFactory传递给我的Startup

var serviceCollection = new ServiceCollection();
// Do some registrations here...

var loggerFactory = new LoggerFactory(); // Actually not created this way. Just an example.
loggerFactory.AddSomeStuff();

var host = WebHost.CreateDefaultBuilder()
    .UseKestrel()
    .ConfigureServices(collection =>
    {
        // I want to use my already configured serviceCollection.
        // I do not want to configure it here...
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
        // I want to use my already configured ILoggerFactory.
        // I do not want to configure it here...
    })
    .UseStartup<Startup>()
    .Build();

基本上我希望我的初创公司能够使用我已创建的loggerFactoryserviceCollection。那可能吗?如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:0)

WebHost的Build方法将ServiceCollection()类的实例实例化为方法变量,并将其传递给每个Action委托(例如:ConfigureService(Action<IServiceCollection>configureService))。似乎没有办法用自定义的替换它除外自己实现IWebHost(可以引入各种各样的问题)。问候。

答案 1 :(得分:0)

您可以将ILoggerFactory的构造函数参数添加到您的Startup类构造函数中。

然后您可以在ConfigureServices方法中使用它。

public class Startup
{
    readonly ILoggerFactory loggerFactory;

    public Startup(ILoggerFactory loggerFactory)
    {
        this.loggerFactory = loggerFactory;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Use it here
        loggerFactory.CreateLogger<..>();
    }
}

答案 2 :(得分:0)

不可能:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#create-logs-in-the-startup-class

不支持在Startup.ConfigureServices方法中完成DI容器设置之前写日志:

  • 不支持将日志记录器注入到Startup构造函数中。
  • 不支持将记录器注入到Startup.ConfigureServices方法签名中

此限制的原因是日志记录取决于DI和配置,而配置又取决于DI。在ConfigureServices完成之前,不会设置DI容器。