城ウィンザー:工場出荷時に作成したオブジェクト内の循環参照を防ぐためにどのように作成されたオブジェクトは、工場に戻って指しました

StackOverflow https://stackoverflow.com/questions/487786

質問

私は私のIoCコンテナとしてのウィンザー城を使用していて、問題のビットに実行されました。 - 私はそれを試してみるように、これは最高の、コード内で説明されています。 私は、ファクトリクラスを持って、それが特定のインターフェイスの実装を私に提供する必要があります:

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}
私はこれが移動するための方法であることを確認していないのに

ファクトリクラスの実装は、次のようになります。     パブリックインターフェイスObjectCreatorFactory:IObjectCreatorFactory     {         IEnumerableをspecificCreators;         IObjectCreator defaultCreator;

    public ObjectCreatorFactory(IEnumerable<IObjectCreator> specificCreators, IObjectCreator defaultCreator)
    {
        this.specificCreators= specificCreators;
        this.defaultCreator= defaultCreator;
    }
    public IObjectCreator GetObjectCreator(Type objectType)
    {
        foreach (IObjectCreator creator in specificCreators)
        {
            if (creator.SupportsType(objectType))
            {
                return creator;
            }
        }
        return defaultCreator;
    }
}

さて、これは大丈夫うまくだろうが、私は特定のIObjectCreatorを使用して、子オブジェクトを作成するために、私のIObjectCreatorインスタンスをしたい場合、私はObjectCreatorFactoryを呼び出すしたいと思い、これは明らかに循環参照になります:

public void SpecificObjectCreator:IObjectCreator
{
    IObjectCreatorFactory objCreatorFactory;
    public SpecificObjectCreator(IObjectCreatorFactory objCreatorFactory)
    {
        this.objCreatorFactory = objCreatorFactory;
    }
    T CreateObject<T>(IDataRow data)
    {
        T obj = new T;
        ChildObject childObject = objCreatorFactory.GetObjectCreator(typeof(ChildObject)).CreateObject<ChildObject>(data);
         .......
    }
    bool SupportsType(Type type);        
}

これはうまくいきません。何作成されたオブジェクトは、子オブジェクトの作成者のための工場に戻って参照のうえされているこのシナリオのために移動するための方法、でしょうか?

役に立ちましたか?

解決

私は単純に、様々な特定のオブジェクトクリエイターのコンストラクタの外に工場を移動し、クリエイターを初期化するために、代わりに責任IObjectCreatorインターフェイス上のメソッドを紹介します。

public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
    void Initialize(IObjectCreatorFactory factory);
}

そして、ちょうど工場に渡される各オブジェクトの作成者にInitialze(これ)を起動します。

私はすなわちから追加コンポーネント構成を適用する(自動的に両方の循環依存を避けるために、コンポーネントの「ポスト・建設」の設定を呼び出すの世話をするために、カスタムライフサイクルのステージを使用しましたし、また他の関連する懸念の世話をするために、過去には外部データベースのようなソース) - それはあなたが必要なもののために、おそらく行き過ぎだ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top