Dependency injection Castle Windsor:如何防止工厂创建的对象中的循环引用被创建的对象引用回工厂

Dependency injection Castle Windsor:如何防止工厂创建的对象中的循环引用被创建的对象引用回工厂,dependency-injection,inversion-of-control,castle-windsor,factory,Dependency Injection,Inversion Of Control,Castle Windsor,Factory,我使用温莎城堡作为我的IoC容器,遇到了一些问题。这是最好的解释代码,所以我会给它一个尝试。 我有一个工厂类,它应该为我提供特定接口的实现: public interface IObjectCreatorFactory { IObjectCreator GetObjectCreator(Type objectType); } public interface IObjectCreator { T CreateObject<T>(IDataRow data);

我使用温莎城堡作为我的IoC容器,遇到了一些问题。这是最好的解释代码,所以我会给它一个尝试。 我有一个工厂类,它应该为我提供特定接口的实现:

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}
公共接口IObjectCreatorFactory
{
IObjectCreator GetObjectCreator(类型objectType);
}
公共接口IObjectCreator
{
T CreateObject(IDataRow数据);
bool-SupportsType(类型);
}
factory类的实现可能是这样的,尽管我不确定这是一种方式: 公共接口ObjectCreatorFactory:IOObjectCreatorFactory { 数不清的具体创造者; IObjectCreator默认创建者

    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;
    }
}
PublicObjectCreatorFactory(IEnumerable SpecificCreator,IObjectCreator defaultCreator)
{
this.specificreators=specificreators;
this.defaultCreator=defaultCreator;
}
公共IObjectCreator GetObjectCreator(类型objectType)
{
foreach(特定创建者中的IObjectCreator)
{
if(创建者支持类型(对象类型))
{
回归创造者;
}
}
返回默认创建者;
}
}
现在这就行了,但如果我想让我的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);        
}
public void SpecificObjectCreator:IOObjectCreator
{
IObjectCreatorFactory objCreatorFactory;
公共特定对象创建者(IObjectCreatorFactory objCreatorFactory)
{
this.objCreatorFactory=objCreatorFactory;
}
T CreateObject(IDataRow数据)
{
T obj=新的T;
ChildObject ChildObject=objCreatorFactory.GetObjectCreator(类型化(ChildObject)).CreateObject(数据);
.......
}
bool-SupportsType(类型);
}

这是行不通的。在这种情况下,如果创建的对象引用回子对象创建者的工厂,该怎么办?

我只需将工厂从各种特定对象创建者的构造函数中移出,并在IObjectCreator界面上引入一种方法,负责初始化创建者:

public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
    void Initialize(IObjectCreatorFactory factory);
}
公共接口IObjectCreator
{
T CreateObject(IDataRow数据);
bool-SupportsType(类型);
无效初始化(IObjectCreatorFactory);
}
然后对传入工厂的每个对象创建者调用Initialze(this)


在过去,我使用自定义生命周期阶段来自动调用组件的“构建后”设置,以避免循环依赖关系,并处理其他相关问题(即从外部源(如数据库)应用额外的组件配置)-但对于你所需要的东西来说,这可能是过分的。

这是一个好办法。我最终用定位器类替换了我的工厂类。然后,该类使用windsorContainer.Resolve(constructorName)查找创建者。