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严重依赖于。
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
等?
我发现的唯一方法是使用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。