属性注入需要一些额外的设置。让我们假设在您的情况下,我们有这个类层次结构:
public class HomeController
{
public ITest Test {get; set;}
}
public class Test : ITest
{
public IRepository Repository {get;set;}
}
public class Repository: IRepository
{
}
需要做的第一件事是将返回类型更改为 IServiceProvider并使用“Autofac.Extensions.DependencyInjection”方法中的方法ConfigureServices(IServiceCollection services)
构建新容器,以返回 AutofacServiceProviderPopulate
新的 ConfigureServices 方法:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();
ContainerBuilder builder = new ContainerBuilder();
builder.Populate(services);//Autofac.Extensions.DependencyInjection
/*Here we are going to register services for DI*/
return new AutofacServiceProvider(builder.Build());
}
下一步是在 DI 容器中注册类。“服务类”的属性注入比“控制器”需要更少的操作。要为服务类设置属性注入,您只需要:
- 在容器中注册类型:
builder.RegisterType<Repository>().As<IRepository>();
- 使用PropertiesAutowired()注册您将通过属性注入依赖项的类型:
builder.RegisterType<Test>.As<ITest>().PropertiesAutowired()
要为控制器设置属性注入,您需要更多步骤:
- 执行
AddControllersAsServices()
时间services.AddMvc()
为所有控制器调用的控制器注册 DI PropertiesAutowired()
:
//in case you just need to allow registration for several specific controllers change this line
var controllersTypesInAssembly = typeof(Startup).Assembly
.GetExportedTypes()
.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
因此,这里是用于预定层次结构的 ConfigureServices():
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();
ContainerBuilder builder = new ContainerBuilder();
builder.Populate(services);//Autofac.Extensions.DependencyInjection
builder.RegisterType<Repository>().As<IRepository>()
.InstancePerLifetimeScope();
var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
builder.RegisterType<Test>().As<ITest>().PropertiesAutowired();
return new AutofacServiceProvider(builder.Build());
}