Castle Windsor: Comment éviter les références circulaires dans les objets créés en usine lorsque les objets créés sont renvoyés à l'usine

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

Question

J'utilise windsor Castle comme conteneur IoC et j'ai rencontré un problème. Ceci est mieux expliqué dans le code, donc je & # 180; je vais l'essayer. J'ai une classe d'usine qui devrait me fournir les implémentations d'une certaine interface:

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

La mise en œuvre de la classe d'usine pourrait ressembler à ceci, bien que je ne sois pas sûr que ce soit la voie à suivre:     interface publique 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;
    }
}

Maintenant, tout irait bien, mais si je veux que mon instance IObjectCreator crée des objets enfants à l'aide d'un IObjectCreator spécifique, j'aimerais appeler ObjectCreatorFactory, ce qui entraîne évidemment une référence circulaire:

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

Cela ne marche pas. Quel serait le chemin à suivre pour ce scénario, où les objets créés font référence à la fabrique pour les créateurs d’objets enfants?

Était-ce utile?

La solution

Je voudrais simplement déplacer l'usine des constructeurs des différents créateurs d'objets spécifiques et introduire une méthode sur l'interface IObjectCreator, chargée d'initialiser les créateurs:

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

Et ensuite, il suffit d'appeler Initialze (this) sur chaque créateur d'objet transmis à la fabrique.

Dans le passé, j’utilisais des étapes de cycle de vie personnalisées pour prendre en charge l’appel automatique de & "post-construction &"; configuration des composants afin d’éviter les dépendances circulaires et de prendre en compte d’autres problèmes associés (application d’une configuration supplémentaire à partir d’une source externe, comme une base de données), mais cela risque de ne pas suffire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top