1

J'utilise windsor castle comme conteneur IoC et j'ai rencontré un petit problème. C'est mieux expliqué dans le code, donc je vais essayer. J'ai une classe d'usine, qui devrait me fournir les mises en œuvre d'une certaine interface:Castle Windsor: Comment éviter les références circulaires dans les objets créés en usine où les objets créés se réfèrent à l'usine

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, mais je ne suis 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, cela fonctionnerait ok, mais si je veux que mon exemple IObjectCreator pour créer des objets de l'enfant à l'aide d'un IObjectCreator spécifique, je voudrais appeler ObjectCreatorFactory, et cela se traduit évidemment par 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 fonctionne pas. Quel serait le chemin à suivre pour ce scénario, où les objets créés retournent à l'usine pour les créateurs d'objets enfants?

Répondre

2

Je voudrais simplement déplacer l'usine hors des constructeurs des différents créateurs d'objets spécifiques, et d'introduire une méthode sur l'interface IObjectCreator à la place, responsable de initialisant les créateurs:

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

Et puis invoquer juste Initialze (ceci) sur chaque créateur d'objet passé dans l'usine. Par le passé, j'ai utilisé des étapes de cycle de vie personnalisées pour appeler automatiquement la configuration "post-construction" des composants afin d'éviter les dépendances circulaires et de prendre en compte d'autres problèmes associés (par exemple, l'application de composants supplémentaires). une source externe comme une base de données) - mais c'est probablement trop pour ce dont vous avez besoin.

+0

C'est une bonne façon de procéder. J'ai fini par remplacer ma classe d'usine par une classe de localisation. La classe localise ensuite les créateurs en utilisant windsorContainer.Resolve (constructorName). –

Questions connexes