簡體   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