Внедрение свойства требует дополнительной настройки.Предположим, что в вашем случае у нас есть эта иерархия классов:
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()
Regiser 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());
}