2011-02-07 16 views
0

は、私が持っていると言う:ネストされた解像度

ProductA 
ProductB 

ProductScreen 

ProductAScreen1 : ProductScreen 
ProductAScreen2 : ProductScreen 

ProductBScreen1 : ProductScreen 
ProductBScreen2 : ProductScreen 

私は、製品にローカルの画面を登録するように私はそれを設定するにはどうすればよいですか?だから私がProductAに入ってIEnumerableを渡すと、ProductBの画面が解決されません。

これは生涯のスコープのようなものを使って達成できると思っていましたが、正しく理解していないようです。

答えて

4

ライフタイムスコープは、インスタンスの有効期間を制御するために使用されます。あなたはコントロールの選択について話しています。そのためには、Autofacのthe metadata featuresをご覧ください。メタデータを使用して

、あなたはそれが属する製品を示す、「タグ」の各製品の画面を行うことができます

builder.Register(c => new ProductAScreen1()).As<ProductScreen>() 
    .WithMetadata<IProductScreenMetadata>(m => 
     m.For(am => am.ProductType, typeof(ProductA))); 
builder.Register(c => new ProductAScreen2()).As<ProductScreen>() 
    .WithMetadata<IProductScreenMetadata>(m => 
     m.For(am => am.ProductType, typeof(ProductA))); 

builder.Register(c => new ProductBScreen1()).As<ProductScreen>() 
    .WithMetadata<IProductScreenMetadata>(m => 
     m.For(am => am.ProductType, typeof(ProductB))); 
builder.Register(c => new ProductBScreen2()).As<ProductScreen>() 
    .WithMetadata<IProductScreenMetadata>(m => 
     m.For(am => am.ProductType, typeof(ProductB))); 

次は、製品の種類に応じてIEnumerable<Lazy<ProductScreen, IProductScreenMetadata>>の依存を取ると画面を解決することができます

var productScreens = _screens.WHere(a => a.Metadata.ProductType == typeof(ProductA)); 

更新:更新:the Keyed approachを使用すると、より簡単な解決方法があります。まず、登録は非常に簡単です:

public class SomeService  
{ 
    private IEnumerable<ProductScreen>> _screens; 
    public SomeService(IIndex<Type, IEnumerable<ProductScreen>> screens) 
    { 
     _screens = screens; 
    } 

    public void DoSomething() 
    { 
     var screensForProductA = _screens[typeof(ProductA)]; 
    } 
} 

注:好奇心のため

builder.RegisterType<ProductAScreen1>().Keyed<ProductScreen>(typeof(ProductA)); 
builder.RegisterType<ProductAScreen2>().Keyed<ProductScreen>(typeof(ProductA)); 
builder.RegisterType<ProductBScreen1>().Keyed<ProductScreen>(typeof(ProductB)); 
builder.RegisterType<ProductBScreen2>().Keyed<ProductScreen>(typeof(ProductB)); 

たちはIIndex<,>種類に依存性を取る必要がありますキーサービスのコレクションを解決する代わりに、タイプ登録をハードコードする方法は、「慣例による」登録を行う方法です:

var assembly = ...; 
var productTypes = ...; // a collection of all the product types 

foreach(var productType in productTypes) 
{ 
    builder.RegisterAssemblyTypes(assembly) 
     .Where(t => typeof(ProductScreen).IsAssignableFrom(t)) 
     .Where(t => t.Name.StartsWith(productType.Name)) 
     .Keyed<ProductScreen>(productType); 
} 
+0

ありがとうございます。それは良い選択肢のようだ。私は、それを.Keyed()を使って登録するのと一緒に試みました。彼らはどちらもまともな解決策のようです。 – Mark

+0

このシナリオではキー入力が簡単です。あまりにも私はそれについてすべてを忘れてメタデータのものに焦点を当てていた:) –

関連する問題