【发布时间】: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 Core 和 MVC 集成到现有环境中,而不是反过来呢?也许通过手动设置而不是使用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