1

IoC コンテナーとしてウィンザー城を使用していますが、ちょっとした問題が発生しました。これはコードで最もよく説明されているので、試してみます。特定のインターフェイスの実装を提供するファクトリ クラスがあります。

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}

ファクトリ クラスの実装は次のようになりますが、これが正しい方法かどうかはわかりません。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);        
}

これはうまくいきません。作成されたオブジェクトが子オブジェクト作成者のファクトリを参照しているこのシナリオでは、どうすればよいでしょうか?

4

1 に答える 1

2

さまざまな特定のオブジェクト クリエーターのコンストラクターからファクトリを移動し、代わりに、クリエーターの初期化を担当する IObjectCreator インターフェイスにメソッドを導入します。

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

そして、ファクトリに渡された各オブジェクトクリエーターで Initialze(this) を呼び出すだけです。

過去に、カスタムライフサイクルステージを使用して、コンポーネントの「構築後」セットアップを自動的に呼び出して、循環依存を回避し、その他の関連する問題を処理しました (つまり、外部ソースから追​​加のコンポーネント構成を適用するなど)。データベース)-しかし、必要なものにはおそらくやり過ぎです。

于 2009-02-05T08:11:51.880 に答える