UseUnityServiceProvider 在 WebApplicationBuilder 上无法正常工作

问题描述 投票:0回答:1

我正在尝试从

.NET3.1
迁移到
.NET6.0
WebAPI。我阅读了 this 作为执行此迁移的手册。

我使用

UnityContainer
作为
DependencyInjection
框架。所以在
.NET3.1
我有这样的东西:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .UseUnityServiceProvider() // Here is UnityServiceProvider registeration.
        .UseNLog()
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.ClearProviders();

            logging.SetMinimumLevel(LogLevel.Trace);
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureHostConfiguration(config =>
        {
            config.AddCommandLine(args);
        });
}

这个

IHostBuilder
使用
UseUnityServiceProvider
Startup.cs
调用我的
ConfigureContainer(IUnityContainer container)
中名为
Startup.cs
的方法,该方法负责注册所有
Dependencies

移动到

.NET6.0
后,我将
Program.cs
替换为:

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        builder.WebHost.UseUnityServiceProvider(); // Using .WebHost I'm able to add UnityServiceProvider

        builder.WebHost.ConfigureAppConfiguration(config =>
        {
            config.AddCommandLine(args);
        });

        var startup = new Startup(builder.Configuration);

        startup.ConfigureServices(builder.Services);

        var app = builder.Build();

        startup.Configure(app, app.Environment);

        app.Run();
    }
}

但是它不会导致任何对我的

ConfigureContainer(IUnityContainer container)
的呼叫。所以我没有在 UnityContainer 上注册任何内容。我的整个
DI
都没用了。

对此有什么建议吗?

c# asp.net-core-webapi .net-6.0 unity-container
1个回答
0
投票

正如您在unity官方网站中看到的那样,Unity说

如果您的项目依赖于 Unity 容器并且您希望它成为 维护和开发,请支持。请记住,我只能拥有 一份全职工作,因此如果没有适当的财务支持,将会 v5.11 之后不再发布

如果您看到 Unity GitHub,您会发现减少开发活动非常重要。

所以不幸的是我认为团结处于半弃用状态。

我建议你,对于现代 .NET,使用 Autofac 而不是 unity。如果您想在基于 .NET 6 的配置中使用 Autofac,您可以看到这个问题作为示例和下面的代码

            var configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("autofac.json");
            var autoFacConfigurationModule = new ConfigurationModule(configurationBuilder.Build());
            var temp = new IpTablesDotNetSystem();

            var builder = WebApplication.CreateBuilder(args);

            builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory((containerBuilder) =>
            {
                containerBuilder.RegisterModule(autoFacConfigurationModule);
                //containerBuilder.RegisterType<IpTablesDotNetSystem>().As<IIpTablesSystem>().SingleInstance();
            }
            ));
            // Add services to the container.
            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();


            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
© www.soinside.com 2019 - 2024. All rights reserved.