2010-11-29 2 views
0

コンストラクタインジェクションを使用するIoCコンテナを使用しています(Castle Windsorなど)。私はそれが唯一のクラスの消費者によって知られている製品に依存している注入されたサービスとデータを持つクラスの依存性注入の構成

public class ProductDataManager 
{ 
    public ProductDataManager(Product product, IProductDataLoader productDataLoader) 
    { 
    } 

    // a number of methods here that manage the products data in different ways... 
} 

...製品を管理し、次の(例)クラスを持っています。また、製品データローダサービスに依存しています。私はこのサービスの実装者をIoCコンテナに定義します。

サービス依存関係(IProductDataLoader)をIoCコンテナによってインジェクトでき​​るように、IoCコンテナ(および消費クラス)でこのクラス(ProductDataManager)を定義し、データ依存性消費階級を過ぎた?

これはコードのにおいですか?もしそうなら、これをどのように変更することができますか?

答えて

4

あなたはTypedFactoryFacilityを使用して、この(私の頭の上から)のような何かを行うことができます...まず、あなたの抽象工場のためのインタフェースを定義します。

public interface IProductDataManagerFactory 
{ 
    ProductDataManager Create(Product product); 
} 

そうのような工場を登録します。

container.AddFacility<TypedFactoryFacility>(); 
container.Register(Component.For<IProductDataManagerFactory>().AsFactory()); 

サービスはIProductDataManagerFactoryに依存し、Windsorは自動実装された工場を通じてcontainer.Resolveを呼び出します。

メソッドシグニチャのパラメータ名productは、ProductDataManagerのctorのパラメータ名に対応する必要があります。

+0

工場が単純なnew()の場合、インターフェイスを作成する必要はないと言えます.Func を注入すると何も問題はありません。あなたはそれを行うための洗練された施設を使用することもできます:http://mikehadlow.blogspot.com/2010/01/10-advanced-windsor-tricks-1a-delegate.html –

+0

@マーク:「IXXXFactory」の作成はより多くです冗長で、はるかに明示的で、コードを工場でより理解しやすくします。 'Func 'を使うのは私の意見では少しわかりにくいです。 – Steven