我想运行ASP.NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中,以便为其提供前端。该应用程序使用 Autofac 来处理 DI 问题,这很好,因为它已经有一个扩展Microsoft.Extensions.DependencyInjection
(ASP.NET Core 严重依赖于此)。
现在,我的问题是:ASP.NET Core 想要在 IoC 容器中注册自己的服务,而我自己的容器已经构建好了。我可以看到与 ASP.NET Core 一起运行我自己的“应用程序部分”的唯一方法是在 ASP.NET Core Web 主机的范围内设置我的应用程序Startup
类,这似乎使 ASP.NET Core 表现得像一个完整的应用程序框架而不是 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 核心也MVC在现有环境中而不是相反?也许通过手动设置而不是使用WebHostBuilder
etc.?
我发现的唯一方法是使用 Autofac 容器的 Update() 函数。但 Autofac lib 将这种方法标记为不好的做法 http://docs.autofac.org/en/latest/best-practices/.
启动类之外:
class Program {
public static IContainer Container { get; private set; }
void Main(){
var builder = new ContainerBuilder();
...
Container = builder.Build();
}
}
在启动类中:
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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)