[英]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 Core和MVC ,而不是相反? 也許通過手動設置而不是使用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.