【问题标题】:Castle Windsor: How to prevent circular references in factory-created objects were the created objects refers back to the factoryCastle Windsor:如果创建的对象引用回工厂,如何防止工厂创建的对象中的循环引用
【发布时间】:2023-03-07 03:38:02
【问题描述】:

我使用温莎城堡作为我的 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);        
}

这行不通。在这种情况下,创建的对象将引用回工厂以供子对象创建者使用,该怎么做?

【问题讨论】:

    标签: dependency-injection inversion-of-control castle-windsor factory


    【解决方案1】:

    我会简单地将工厂从各种特定对象创建者的构造函数中移出,并在 IObjectCreator 接口上引入一个方法来代替,负责初始化创建者:

    public interface IObjectCreator
    {
        T CreateObject<T>(IDataRow data);
        bool SupportsType(Type type);
        void Initialize(IObjectCreatorFactory factory);
    }
    

    然后对传入工厂的每个对象创建者调用 Initialze(this)。

    过去,我使用自定义生命周期阶段来处理自动调用组件的“构建后”设置,以避免循环依赖并处理其他相关问题(即从像数据库这样的外部源) - 但它可能对你需要的东西来说有点过头了。

    【讨论】:

    • 这是一个不错的方法。我最终用定位器类替换了我的工厂类。然后该类使用 windsorContainer.Resolve(constructorName) 定位 Creators。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2014-09-24
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多