現在キャッスルウィンザーの子コンテナ機能を使用して、ファクトリメソッドで特定のインスタンスの特定のインスタンスの登録をオーバーライドしています。私は子コンテナを純粋に使用しているため、登録は単一の解決のために一時的です。つまり、登録がそのタイプのすべての解決に影響することは望ましくありません。Castle Windsorの子コンテナを使用して特定のインスタンスの型を解決する
多分、いくつかのコードが私の意味を説明します。
私は工場として機能するFuncを持っていますFunc<IReportCategory, IReportCategoryViewModel>
- IReportCategoryの実装を与え、IReportCategoryViewModelの新しいインスタンスを返します。 (IReportCategoryViewModelはIReportCategoryに依存します)。
次のようにこれは、城ウィンザーに登録されている:
次のようにResolveCategoryViewModelFactory
が実装されている
container.Register(
Component.For<Func<IReportCategory, IReportCategoryViewModel>>().Instance(
category => ResolveCategoryViewModelFactory(container, category)));
:
private CategoryViewModel ResolveCategoryViewModelFactory(IWindsorContainer container, IReportCategory category)
{
using (IWindsorContainer childContainer = new WindsorContainer())
{
childContainer.Register(Component.For<IReportCategory>().Instance(category));
container.AddChildContainer(childContainer);
return childContainer.Resolve<IReportCategoryViewModel>();
}
}
何上記の方法は達成するの特定のインスタンスを注入し、IReportCategoryViewModelの解像度を依存関係としてのIReportCategory。 IReportCategoryViewModelに満足する必要のある他の依存関係がある場合、これらはコンテナによって自動的に挿入されます。
次のように私は、その後のFuncを使用することができます。
public class Test
{
private readonly Func<IReportCategory, IReportCategoryViewModel> factory;
public Test(Func<IReportCategory, IReportCategoryViewModel> factory)
{
this.factory = factory;
}
public void ResolveTest()
{
// Create a category (note: this would probably be resolved from the container in some way)
IReportCategory category = new ReportCategory();
// Call into the factory to resolve the view model
IReportCategoryViewModel vm = factory(category);
}
...
質問:はこれを行うために適切なもののように見えるのか?私が得た印象から、子供用コンテナはCastle Windsorではお勧めできません - 同じ結果を達成する別の方法がありますか?
ありがとうございました。
これを行うには、型付きファクトリが本当に便利です。多くの人がKrzysztofに感謝します! –
これは、子コンテナと同じ動作にはなりません。ファクトリメソッドの引数にコンストラクタ引数を一致させるために名前を使用するため、ファクトリ自体によって返される型に対してのみ機能します。つまり、注入が必要な場合は、インスタンスをファクトリメソッドに渡します。ここに私がこれを探求するために使ってきた要点があります(これはもっと良く説明するかもしれません)。https://gist.github.com/1357829 – GraemeF