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