Используя Autofac, я хотел бы зарегистрировать компонент и указать для конкретной зависимости, которая должна быть разрешена именованному экземпляру.Autofac: разрешить определенную зависимость от именованного экземпляра
Я нашел образцы, похожие на следующие, используя инжектор конструктора, который почти то, что я хочу.
builder.Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
.As<IObjectContainer>()
.Named("CustomerObjectContainer");
builder.Register(c => new ObjectContainer(ConnectionStrings.FooDB))
.As<IObjectContainer>()
.Named("FooObjectContainer");
builder.Register(c => new CustomerRepository(
c.Resolve<IObjectContainer>("CustomerObjectContainer"));
builder.Register(c => new FooRepository(
c.Resolve<IObjectContainer>("FooObjectContainer"));
Однако, мне нужно это с инъекцией собственности, и я не хочу, чтобы указать все зависимости.
Что-то вроде:
builder.Register<CustomerRepository>().With<IObjectContainer>("CustomerObjectContainer");
builder.Register<FooRepository>().With<IObjectContainer>("FooObjectContainer");
Застройка всех неопределенных dependnecies должно произойти с неназванными экземплярами.
Благодаря, Алекс
[Прибавление в ответ от Danielg]
Перегрузка разрешить по типу для любого свойства этого типа.
public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithDependency<TLimit, TReflectionActivatorData, TStyle, TProperty>(
this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration,
Func<IComponentContext, TProperty> valueProvider)
where TReflectionActivatorData : ReflectionActivatorData
{
return registration.WithProperty(new ResolvedParameter((p, c) =>
{
PropertyInfo prop;
return p.TryGetDeclaringProperty(out prop) &&
prop.PropertyType == typeof(TProperty);
},
(p, c) => valueProvider(c)));
}