繁体   English   中英

ASP.NET Core与现有的IoC容器和环境?

[英]ASP.NET Core with existing IoC container & environment?

我想在已经托管现有应用程序的Windows服务环境中运行ASP.NET Core Web堆栈和MVC ,以便为它提供前端。 该应用程序使用Autofac进行DI关注,这很好,因为它已经有一个Microsoft.Extensions.DependencyInjection的扩展(ASP.NET Core很大程度上依赖它)。

现在,我的问题是:ASP.NET Core希望在IoC容器中注册自己的服务,在我自己的容器已经构建的阶段。 我可以看到与ASP.NET Core一起运行我自己的“应用程序部分”的唯一方法是在ASP.NET Core Web主机Startup类的范围内设置我的应用程序,这似乎使ASP.NET Core表现得像一个完整的应用程序框架而不是Web框架。 我还试过完全放弃Startup并像这样设置web主机:

        var containerBuilder    = new ContainerBuilder();
        var container           = containerBuilder.Build();
        var webHost             = new WebHostBuilder()
            .ConfigureServices(services =>
            {
                services.AddMvc();
            })
            .Configure(app =>
            {
                app.ApplicationServices = new AutofacServiceProvider(container);
                app.UseStaticFiles();
                app.UseMvc();
            })
            .UseKestrel()
            .UseIISIntegration()
            .Build();

        webHost.Run();

但是这不起作用,因为一旦构建Web主机,ASP.NET Core似乎会覆盖所有配置。 那么,有没有办法在现有环境中集成ASP.NET CoreMVC ,而不是相反? 也许通过手动设置而不是使用WebHostBuilder等?

我找到的唯一方法是使用Autofac容器的Update()函数。 但Autofac lib将此方法视为不良做法

在Startup类之外:

class Program {
   public static IContainer Container { get; private set; }

   void Main(){
      var builder = new ContainerBuilder();
      ...
      Container = builder.Build();
   }
}

在Startup类中:

 public abstract class Startup
 {
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
       var builder = new ContainerBuilder();
       builder.Populate(services);
       // Update existing container
       builder.Update(Program.Container);
    }
 }

肯定是一个糟糕的黑客+我建议避免这种方法。

但答案是

不要在Startup.Configure之前构建容器

并不总是适用。 在我的情况下,我使用Azure Service Fabric .Net Core WebAPI无状态服务和建议在Startup中构建容器是错误的,因为我需要在Startup运行之前注入StatelessService。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM