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

本文关键字:IoC 环境 NET Core ASP | 更新日期: 2023-09-27 18:02:13

我想运行ASP。. NET Core web栈以及MVC在Windows服务环境中,该环境已经承载了一个现有的应用程序,以便为它提供一个前端。该应用程序使用Autofac来处理DI问题,这很好,因为它已经为Microsoft.Extensions.DependencyInjection提供了扩展。. NET Core严重依赖于。

现在,我的问题是:ASP。. NET Core希望在IoC容器中注册自己的服务,在我自己的容器已经构建的阶段。我能看到的唯一方法是运行我自己的"应用程序部分"与ASP。. NET Core是通过在ASP. NET的范围内设置我的应用程序。. NET Core网站主机Startup类,出现什么使ASP。. NET Core更像是一个成熟的应用程序框架,而不是web框架。我还尝试了完全放弃启动并设置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();

然而,这不起作用,因为ASP。. NET Core似乎覆盖所有的配置,只要web主机正在建立。那么,有没有一种方法可以将ASP。. NET Core以及MVC在现有环境中,而不是其他方式?也许通过手动设置而不是使用WebHostBuilder等?

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

我发现的唯一方法是使用Autofac容器的Update()函数。但是Autofac库将此方法标记为不良实践。

在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);
    }
 }

这肯定是一个坏的hack +我建议避免这种方法

但是答案

不要在启动之前构建容器。配置

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