.NET6.0中WebApplicationBuilder使用UseUnityServiceProvider不生效
解决.NET6中UnityContainer ConfigureContainer未触发的问题
方案1:保留Startup.cs并触发ConfigureContainer
.NET6的WebApplicationBuilder默认不会自动调用Startup.cs中的ConfigureContainer方法,需要手动指定使用Startup类来恢复原有逻辑:
在Program.cs中修改配置:
var builder = WebApplication.CreateBuilder(args); // 配置Unity服务提供器并指定Startup类 builder.WebHost.UseUnityServiceProvider() .UseStartup<Startup>(); var app = builder.Build(); // 后续中间件配置... app.Run();
你的Startup.cs可以保留原有ConfigureContainer方法不变:
public class Startup { public void ConfigureServices(IServiceCollection services) { // 原生服务配置逻辑(如添加MVC、Swagger等) } public void ConfigureContainer(IUnityContainer container) { // 你的Unity依赖注册逻辑 container.RegisterType<IMyService, MyService>(); // 更多注册项... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 中间件管道配置 } }
方案2:直接在Program.cs中注册Unity依赖(适配.NET6最小API风格)
如果不想保留Startup.cs,可以直接在Program.cs中完成Unity依赖注册,替代ConfigureContainer的作用:
方式A:提前创建容器并传入
var builder = WebApplication.CreateBuilder(args); // 创建Unity容器并完成依赖注册 var unityContainer = new UnityContainer(); unityContainer.RegisterType<IMyService, MyService>(); // 其他依赖注册... // 将容器传入Unity服务提供器 builder.WebHost.UseUnityServiceProvider(unityContainer); var app = builder.Build(); // 后续中间件配置... app.Run();
方式B:使用回调注册
var builder = WebApplication.CreateBuilder(args); // 配置Unity服务提供器时,通过回调完成依赖注册 builder.WebHost.UseUnityServiceProvider(container => { container.RegisterType<IMyService, MyService>(); // 更多注册项... }); var app = builder.Build(); // 后续中间件配置... app.Run();
注意事项
- 确保安装的
Unity.AspNetCore包版本适配.NET6(推荐使用5.0及以上版本,该版本兼容.NET6) - 避免混合使用原生DI和Unity注册同一服务,防止依赖解析冲突
- 如果原有项目中
Startup.cs包含ConfigureServices方法,使用UseStartup<Startup>()会自动调用该方法,保持原有原生服务配置逻辑不变
内容的提问来源于stack exchange,提问作者RezaNoei
相关产品推荐
相关产品推荐

