我使用windsor城堡作为我的IoC容器,并且遇到了一些问题。最好在代码中解释,所以我会试一试。 我有一个工厂类,它应该为我提供某个接口的实现:
public interface IObjectCreatorFactory
{
IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
T CreateObject<T>(IDataRow data);
bool SupportsType(Type type);
}
工厂类的实现可能看起来像这样,但我不确定这是要走的路: public interface 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);
}
这不起作用。这个场景的方法是什么,创建的对象是否为子对象创建者引用工厂?
答案 0 :(得分:2)
我只是将工厂从各种特定对象创建者的构造函数中移出,并在IObjectCreator接口上引入一个方法,负责初始化创建者:
public interface IObjectCreator
{
T CreateObject<T>(IDataRow data);
bool SupportsType(Type type);
void Initialize(IObjectCreatorFactory factory);
}
然后在每个传递给工厂的对象创建者上调用Initialze(this)。
在过去,我使用自定义生命周期阶段来处理自动调用组件的“构建后”设置,以避免循环依赖性,并且还要处理其他相关问题(即应用其他组件配置)像数据库这样的外部来源) - 但它可能对你所需要的东西有点过分。