使用 .net core 3 及以上ConfigureServices
方法不返回IServiceprovider
. 我们曾经在ConfigureServices
方法中配置 Autofac 并使用它来解析控制器的注册代理,以便我们可以将控制器添加为服务:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var builder = new ContainerBuilder();
services.AddHttpClient();
var mvcBuilder = services.AddMvc(
o =>
{
o.Filters.Add<ModelStateValidationFilter>(1);
o.Filters.Add<RequestLogActionFilter>(int.MinValue);
}).AddMvcOptions(o => o.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
builder.Populate(services);
builder.RegisterModule(_module);
builder.RegisterModule<DiagnosticsModule>();
ApplicationContainer = builder.Build();
mvcBuilder.AddControllersAsServices().AddGeneratedControllerProxies(ApplicationContainer);
return new AutofacServiceProvider(ApplicationContainer);
}
AddGeneratedControllerProxies
扩展方法如下所示:
public static IMvcBuilder AddGeneratedControllerProxies(this IMvcBuilder builder, IContainer applicationContainer)
=> builder.ConfigureApplicationPartManager(
m => m.FeatureProviders.Add(new ControllerProxyFeatureProvider(applicationContainer.ResolveOptional<IEnumerable<ControllerRegistration>>())));
现在,由于 .net core 3+ 及更高版本中 DI 服务提供者工厂的配置不同,ConfigureContainer
因此在运行时调用了一个新方法,用于注册我们的模块和类型。我想在ConfigureServices
方法中解析我的控制器代理,但我无权访问容器,有什么办法可以实现吗?