Внедрение свойств требует дополнительной настройки. Предположим, в вашем случае у нас есть эта иерархия классов:
public class HomeController
{
public ITest Test {get; set;}
}
public class Test : ITest
{
public IRepository Repository {get;set;}
}
public class Repository: IRepository
{
}
Первое, что нужно сделать, это изменить тип возвращаемого значения на IServiceProvider для ConfigureServices(IServiceCollection services)
и создать новый контейнер с использованием метода Populate
из метода Autofac.Extensions.DependencyInjection, чтобы вернуть AutofacServiceProvider.
Новый метод 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());
}
person
svoychik
schedule
31.12.2018