2012-03-14 30 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>());