Я использую Windsor Castle в качестве своего контейнера 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);
}
Это не работает. Каков будет путь для этого сценария, когда созданные объекты возвращаются к фабрике для создателей дочерних объектов?