gpt4 book ai didi

c# - 具有现有 IoC 容器和环境的 ASP.NET Core?

转载 作者:行者123 更新时间:2023-11-30 17:36:51 24 4
gpt4 key购买 nike

我想在已经托管现有应用程序的 Windows 服务环境中运行 ASP.NET Core 网络堆栈和 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();

但是这不起作用,因为 ASP.NET Core 似乎会在构建 Web 主机后立即覆盖所有配置。那么,有没有办法在现有环境中集成 ASP.NET CoreMVC,而不是相反?也许通过手动设置而不是使用 WebHostBuilder 等?

最佳答案

我找到的唯一方法是使用 Autofac 容器的 Update() 函数。但是 Autofac lib 将此方法标记为 bad practice .

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 + 我建议避免这种方法。

但是答案

don't build your container before the Startup.Configure

并不总是适用。在我的例子中,我使用了 Azure Service Fabric .Net Core WebAPI 无状态服务,在 Startup 内部构建容器的建议是错误的,因为我需要在 Startup 运行之前注入(inject) StatelessService。

关于c# - 具有现有 IoC 容器和环境的 ASP.NET Core?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com