Cette question concerne le conteneur Unity mais je suppose qu'il s'applique à tout conteneur de dépendances.Injection de cohérence: injection d'objets partiellement initialisés
J'ai deux classes de dépendances circulaires:
class FirstClass
{
[Dependency]
public SecondClass Second { get; set; }
}
class SecondClass
{
public readonly FirstClass First;
public SecondClass(FirstClass first)
{
First = first;
}
}
Techniquement, il est possible d'instancier et injecter correctement les dépendances pour les deux si les traiter comme des singletons:
var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
Lorsque je tente de faire la même chose avec Unity, je reçois StackOverflowException:
var container = new UnityContainer();
container.RegisterType<FirstClass>(new ContainerControlledLifetimeManager());
container.RegisterType<SecondClass>(new ContainerControlledLifetimeManager());
var first = container.Resolve<FirstClass>(); // StackOverflowException here!
var second = container.Resolve<SecondClass>(); // StackOverflowException here too!
Je comprends que Unity essaie de me protéger d'utiliser des objets partiellement initialisés mais je veux avoir cette protection comme une option, pas une obligation. Question: le comportement actuel est-il disabable?
Je ne aime pas que l'unité ne peut instancier des classes, mais je peux le faire manuellement. A partir du lien MDSN que vous avez donné, aucun des cas suivants n'est vrai dans mon cas: -Objets générés par l'injection de constructeurs qui se référencent mutuellement dans leurs paramètres de constructeur -Objets générés par l'injection du constructeur lorsqu'une instance d'une classe est transmise en tant que paramètre à son propre constructeur -Objets générés par une injection d'appel de méthode se référant mutuellement -Objets générés par une injection de propriété (setter) se référant mutuellement –
Le problème est que pendant quelques instants, "FirstClass" réside sans l'objet de dépendance, ce qui signifie que ce n'est pas vraiment valable. Tout cela dépend essentiellement de ce que font vos objets lorsqu'ils sont construits, si votre deuxième classe essayait d'appeler dans le premier, où le premier s'attendait alors à ce que l'objet dépendant soit disponible, alors cela échouerait. Les chaînes circulaires comme celle-ci sont problématiques, pour plusieurs raisons, vous devriez donc essayer d'éviter, si possible. –
Je préférerais obtenir NRE plutôt que StackOverflowException, en particulier en tenant compte du fait que je peux instancier mes objets manuellement. –