2012-03-14 4 views
3

Используя 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))); 
    } 

ответ

5

Я не думаю, что autofac имеет сокращенный способ сделать это еще, но это возможно с небольшим усилием.

Я написал метод расширения, который делает это. Бросьте его в статический класс расширения, и все должно быть в порядке. Расширение также показывает, как это сделать долгий путь.

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithResolvedProperty<TLimit, TReflectionActivatorData, TStyle, TProperty>(
    this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, 
    string propertyName, Func<IComponentContext, TProperty> valueProvider) 
     where TReflectionActivatorData : ReflectionActivatorData 
{ 
    return registration.WithProperty(new ResolvedParameter((p, c) => 
                   { 
                    PropertyInfo prop; 
                    return p.TryGetDeclaringProperty(out prop) && 
                      prop.Name == propertyName; 
                   }, 
                  (p, c) => valueProvider(c))); 
} 

Не против супер длинный метод подписи, регистрация autofac очень многословен.

Вы можете использовать расширение, подобное этому.

builder.RegisterType<Foo>() 
    .WithResolvedProperty("Bar", c => c.Resolve<IBar>()); 
Смежные вопросы