Castle Windsor: cómo evitar referencias circulares en los objetos creados en fábrica donde los objetos creados se remiten a la fábrica

StackOverflow https://stackoverflow.com/questions/487786

Pregunta

Estoy usando el castillo de Windsor como mi contenedor de IoC, y me he encontrado con un pequeño problema. Esto se explica mejor en el código, así que & # 180; lo intentaré. Tengo una clase de fábrica, que debería proporcionarme implementaciones de una determinada interfaz:

public interface IObjectCreatorFactory
{
    IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
    T CreateObject<T>(IDataRow data);
    bool SupportsType(Type type);
}

La implementación de la clase de fábrica podría verse así, aunque no estoy seguro de que este sea el camino a seguir:     interfaz pública ObjectCreatorFactory: IObjectCreatorFactory     {         I Enumerable creadores específicos;         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;
    }
}

Ahora esto funcionaría bien, pero si quiero que mi instancia IObjectCreator cree objetos secundarios utilizando un IObjectCreator específico, me gustaría llamar a ObjectCreatorFactory, y esto obviamente da como resultado una referencia circular:

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

Esto no funciona. ¿Cuál sería el camino a seguir para este escenario, donde los objetos creados se refieren a la fábrica para los creadores de objetos secundarios?

¿Fue útil?

Solución

Simplemente sacaría la fábrica de los constructores de los diversos creadores de objetos específicos e introduciría un método en la interfaz IObjectCreator, responsable de inicializar a los creadores:

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

Y luego simplemente invoque Initialze (this) en cada creador de objetos pasado a la fábrica.

En el pasado, he usado etapas de ciclo de vida personalizadas para encargarme de invocar automáticamente " post-construcción " configuración de componentes para evitar dependencias circulares y también para ocuparse de otras preocupaciones asociadas (es decir, aplicar la configuración de componentes adicionales desde una fuente externa como una base de datos), pero probablemente sea excesivo para lo que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top