【问题标题】:ASP.NET Core with existing IoC container & environment?具有现有 IoC 容器和环境的 ASP.NET Core?
【发布时间】:2016-12-19 09:19:30
【问题描述】:

我想在已经托管现有应用程序的 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 并像这样设置网络主机:

        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 CoreMVC 集成到现有环境中,而不是反过来呢?也许通过手动设置而不是使用WebHostBuilder 等?

【问题讨论】:

  • 简单地说,在调用Startup.Configure 方法之前不要构建你的容器。在 Configure 方法中,您将获得一个 IServiceCollection 传入。在那里您使用 services.AddXxx(...) 方法注册所有服务和 ASP.NET Core 依赖项。然后将其传递给 autofac:containerBuilder.Populate(services) 以在 Autofac 中注册它们,然后构建容器,并在 Configure 方法中返回它,如此处的文档中所示:docs.autofac.org/en/latest/integration/aspnetcore.html
  • @Tseng 你应该把它写成答案而不是评论。
  • @Tseng 是的,我知道它应该如何完成,但这只是忽略了 ASP.NET Core Web 应用程序不是我的应用程序的组合根的事实,我只是想将 Web 框架作为扩展启动,使用之前创建的现有容器。
  • 您也可以更新已构建的容器,但请查看对此答案stackoverflow.com/a/5009312/455493 的评论。它说,如果服务已经被现有容器解析,它可能会导致不确定的行为。

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


【解决方案1】:

我发现的唯一方法是使用 Autofac 容器的 Update() 函数。但是 Autofac lib 将这种方法标记为bad practice

在 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 + 我建议避免这种方法。

答案

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

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

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2019-06-05
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多