Search code examples
c#asp.net-core-webapi.net-6.0unity-container

UseUnityServiceProvider doesn't works properly on WebApplicationBuilder


I'm trying to migrate from .NET3.1 to .NET6.0 WebAPI. I read this as manual to do this migration.

I'm using UnityContainer as DependencyInjection framework. So in .NET3.1 I have something like this:

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);
        });
}

This IHostBuilder using UseUnityServiceProvider with a Startup.cs calls a method named ConfigureContainer(IUnityContainer container) in my Startup.cs which is responsible to register all Dependencies.

After moving to .NET6.0 I replaced Program.cs with this:

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();
    }
}

But it doesn't causes to any call to my ConfigureContainer(IUnityContainer container). So I have nothing registered on UnityContainer. and my whole DI is useless.

Any advice on this ?


Solution

  • As you can see in unity official site, Unity says

    If your project depends on Unity container and you want it to be maintained and developed, please support it. Remember, I can have only one full time job, so without proper financial backing there will be no more releases beyond v5.11

    and if you see Unity GitHub you can see reduce activity in development is significant.

    So unfortunately I think unity in semi-deprecation state.

    I suggest to you, use Autofac instead of unity for modern .NET. and if you want use Autofac in configuration based on .NET 6 you can see this question as sample and below code

                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();