2011-01-08 25 views
1

非常に限られた数のシナリオでは、未知のType(コンパイル時)からその型に登録されたオブジェクトのインスタンスに移動する必要があります。Castle Windsor Weak Typed Factory

ほとんどの部分については、私はタイプされたファクトリを使用して私は、コンパイル時に解決したい...ので、私は、コンストラクタ

Func<IMyType>を注入タイプを知っている...しかし、シナリオのこれらの限られた数のコンテナへの直接の呼び出しを避けるために(ライブラリからWindsorを参照する必要があります。これは避けたいパターンです)、私はFunc<Type,object>を内部に挿入する必要があります。 FuncのTypeパラメータに対応する型(type)を返します。

これを設定する最も簡単で簡単な方法はありますか?

私は次のことを試してみましたが、この設定で、私は私が望むもので間違いではありません完全に定期的TypedFactoryFacilityバイパス終わる:どのような援助のため、事前に

Kernel.Register(Component.For(typeof (Func<Type, object>)).LifeStyle.Singleton.UsingFactoryMethod(
        (kernel, componentModel, creationContext) => 
         kernel.Resolve(/* not sure what to put here... */))); 

感謝を。

答えて

3

あなたが登録できることを覚えていれば簡単だその初期化するために

ウィンザーの代表者:

container.Register(Component.For<Func<Type,object>>() 
    .Instance(t=>container.Resolve(t))); 

また、入力工場(この工場で過渡コンポーネントを解決する予定の場合は、入力工場が有効範囲を指定するため推奨されています)とcustom selectorを使用することもできます。

container.Register(
     Component.For<YourSelector>(), 
     Component.For<Func<Type,object>>().Lifestyle.Transient 
      .AsFactory(x=>x.SelectedWith<YourSelector>()); 
+0

Func をとる単純なIServiceProviderのインスタンスを挿入することに決めました。そこにどんな懸念? – Jeff

+0

この機能を直接使用するのとどのように違いますか?すべての懸念は生涯に関するものです。引っ張るオブジェクトがいつリリースされるのか、またメモリリークが発生しないのかを考えてみましょう。それはすべてです –

+0

全く違う、あなたが正しいです。 – Jeff

0

私はこのhttp://commonservicelocator.codeplex.com/の共通サービスロケータを使用することができると思います。アヤンドはCastle Windsorのサポートをhttp://ayende.com/blog/archive/2008/10/02/the-common-service-locator-library.aspxに書いたと思います。基本的には、特定のコンテナ(例えば、Windsor/Ninjectなど)に依存することなく、依存関係を解決する方法を提供します。解決しようとしているレベルの共通サービスロケータに依存することになりますが、少なくとも、 WindsorをアプリケーションレベルでNinjectにして、異なるプロジェクトで使用できるようにします。

_containerは、依存関係を解決するために、あなたのIWindsorContainerあり、そして
ServiceLocator.SetLocatorProvider(() => { return new WindsorServiceLocator(_container); }); 

を::

ServiceLocator.Current.GetInstance<MyType>(); 

または

ServiceLocator.Current.GetAllInstances<MyType>(); 
+2

は、私は本当に私のプロジェクトに別のDLLの依存関係を追加する必要はありません...そして、それはコンポーネントの使用(私見)で表現力を示すものではありませんので、サービスロケータを使用すると、一般的に悪い考えと考えられています。 – Jeff

関連する問題