我使用温莎城堡作为我IoC容器,并在一个有点问题的运行。这是在代码中最好的解释,所以I'll试试看。 我有一个工厂类,即应我提供了一定接口的实现:

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);        
}

这个不工作了。什么是去这种情况下,在创建的对象闯民宅回工厂子对象创作者的方法是什么?

有帮助吗?

解决方案

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

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

和然后只传递到工厂的每个对象创建者调用Initialze(本)。

在我使用自定义生命周期阶段采取的自动调用“工后”组件既避免循环依赖的设置护理和也采取的其它相关的关注护理(即,从一个施加额外的组件配置在过去比如数据库的外部源) - 但它可能是你所需要的矫枉过正

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top