ライフタイムスコープは、インスタンスの有効期間を制御するために使用されます。あなたはコントロールの選択について話しています。そのためには、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);
}
ありがとうございます。それは良い選択肢のようだ。私は、それを.Keyed()を使って登録するのと一緒に試みました。彼らはどちらもまともな解決策のようです。 – Mark
このシナリオではキー入力が簡単です。あまりにも私はそれについてすべてを忘れてメタデータのものに焦点を当てていた:) –