Quel est le raisonnement derrière ce comportement cio (Resolve avec plusieurs composants enregistrés)

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

Question

On dirait une approche standard pour un coi quand un scénario donné comme (C # windsor):

container.AddComponent<ILogger, HttpLogger>();
container.AddComponent<ILogger, SmtpLogger>();

var logger = container.Resolve<ILogger>();

serait que lors de la résolution du composant, le premier ILogger (HttpLogger dans ce cas) enregistré est le seul candidat à la résolution, cio ensuite trouver le constructeur les plus enrobées il peut où il croit qu'il peut résoudre toutes les dépendances.

Cependant, il peut bien être le cio ne peut pas résoudre les dépendances pour le premier enregistreur, et thusly revenir avec un problème de résolution, il pourrait bien être le cas que le SmtpLogger aurait pu être résolu si le cio essayé.

Alors, quel est le raisonnement seulement en utilisant le premier service enregistré en tant que candidat? il semble que l'incertitude dont le type que vous obtiendrez est un argument, mais cio est laissé en charge dont le constructeur qu'il utilise de toute façon.

Alors pourquoi ne pas choisir parmi tous les constructeurs de tous types applicables, et commencer à essayer de résoudre des constructeurs les plus gras vers le bas (agnostique du type réel)?

Cela peut avoir une réponse vraiment évidente, mais honnêtement, je ne sais pas.

Merci d'avance, Stephen.

Était-ce utile?

La solution

La raison est son effet sur la complexité de mise en œuvre.

Lorsque ce genre de comportement est mis en œuvre, il se trouve au travail récursive, par exemple déterminer si les dépendances d'un des enregistreurs peut être satisfait, il faudra une promenade tous son dépendances et ainsi de suite.

Pour ce faire efficacement est difficile, et ajoute beaucoup de complexité au contenant et à l'expérience de débogage.

MEF, alors que pas strictement un conteneur IoC, ne le font d'une manière similaire à ce que vous avez dit - il fait partie du comportement de composition stable, ce que nous appelons « rejet »

.

http : //blogs.msdn.com/nblumhardt/archive/2009/07/17/light-up-or-mef-optional-exports.aspx

Dans plug-in très dynamique des scénarios, le rejet est extrêmement utile. Dans les scénarios Windsor, Autofac etc ciblons, l'effort supplémentaire ne paie pas tant.

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