2012-03-14 10 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 FROM答えるためADDITION]

そのタイプの任意のプロパティの種類によって解決する過負荷。

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

私はオートファックがまだこれをやっているという簡潔な方法はないと思っていますが、少し努力することは可能です。

私はこれを行う拡張メソッドを書いています。静的な拡張クラスでそれを投げて、あなたはうまくいくはずです。エクステンションはこれをどのようにするのかを示しています。

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>()); 
関連する問題