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
-
20-08-2019 - |
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?
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.