在.NET Core中的ConfigureService-Methods(尤其是IApplicationLifetime)中使用DI

时间:2017-04-27 06:33:32

标签: c# asp.net-core .net-core

我试图为执行某些代码的IWebHostBuilder实现一个新的扩展方法,比如在某处注册。 重要的是,它在应用程序关闭时也会取消注册。

我添加了一些代码,显示了我想要做的事情。这里的问题是,IApplicationLifetime的实例尚未可用。这个新的扩展方法在构建WebHost的管道中添加了最后

public static IWebHostBuilder UseHttpGatewayappRegistration(this IWebHostBuilder webHostBuilder)
    {
        webHostBuilder.ConfigureServices(services =>
        {
            var sp = services.BuildServiceProvider();

            // This instance is not available
            IApplicationLifetime applicationLifetime = sp.GetService<IApplicationLifetime>();

            // These instances are ok
            AppSettings appSettings = sp.GetService<AppSettings>();
            ILoggerFactory loggerFactory = sp.GetService<ILoggerFactory>();

            var registration = new Registration(loggerFactory.CreateLogger<Registration>());

            applicationLifetime.ApplicationStopping.Register(() =>
            {
                registration.Unregister();
            });
        });

        return webHostBuilder;
    }

为什么IApplicationLifetime实例为null,即使我在构建WebHost管道的管道中最后添加了这个扩展方法?如果有人能向我提供有关所有&#34; ConfigureServices&#34;的执行顺序的一些信息,那将是很棒的。方法以及如何或者如果可以在IApplicationLifetime方法中使用ConfigureServices

我知道我可以在没有WebHostBuilder的情况下完成所有这些工作,但我在那里做到这一点似乎是合乎逻辑的,我也认为必须有办法。

不幸的是,我无法在网上找到太多信息......

谢谢。

编辑:我找到了一种在ConfigureServices方法中使用DI的方法。我相应地编辑了这个问题。这帮助了我:How to Resolve Instance Inside ConfigureServices in ASP.NET Core

1 个答案:

答案 0 :(得分:4)

您无法从IApplicationLifetime方法访问ConfigureServices个实例。这是设计的。检查&#34;启动中可用的服务&#34;部分在这里:  Application Startup in ASP.NET Core

IApplicationLifetime方法中解析IWebHostBuilder.Configure(如果稍后在Startup.Configure配置管道中使用它,则会替换IWebHostBuilder方法):

public static IWebHostBuilder Foo(this IWebHostBuilder webHostBuilder)
{
    webHostBuilder.Configure(x =>
    {
        var service = x.ApplicationServices.GetService<IApplicationLifetime>();
    });

    return webHostBuilder;
}

也可以扩展原始的Startup.Configure方法,而不是替换(应该添加很多反射逻辑来制作此解决方案可靠):

.Configure(app =>
{
    var env = app.ApplicationServices.GetService<IHostingEnvironment>();
    dynamic startup = Activator.CreateInstance(typeof(TStartup), env);

    //Carefully resolve all input parameters.
    //Make sure all required services are registered in DI.
    startup.Configure(app, env);

    var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>();
})