我使用windsor城堡作爲IoC容器,並且遇到了一些問題。這是最好的代碼解釋,所以我會試一試。 我有一個工廠類,應該爲我提供了一定的接口實現:Castle Windsor:如何防止工廠創建的對象中的循環引用是創建的對象返回到工廠
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);
}
這是行不通的。在這種情況下,創建的對象是否將子對象創建者引回到工廠?
這是一個好方法。我最終用一個定位器類替換了我的工廠類。該類然後通過使用windsorContainer.Resolve(constructorName)來定位Creators。 – 2009-02-17 10:34:56