我正在尝试从
.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
都没用了。
对此有什么建议吗?
正如您在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();