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?
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). –