UnityContainer.Résoudre ou ServiceLocator.GetInstance?
Il pourrait sembler une question stupide, parce que dans mon code, tout fonctionne, mais j'ai enregistré un singleton de cette façon avec mon Unité de conteneur _ambientContainer
:
_ambientContainer.RegisterType<Application.StateContext>(new ContainerControlledLifetimeManager());
Afin d'éviter d'utiliser mon champ local, j'utilise:
get {
return ServiceLocator.Current.GetInstance<Application.StateContext>();
}
à l'intérieur de mon obtenir la propriété pour obtenir une instance de mon objet.
De cette façon, j'obtiens toujours la même instance (Application.StateContext
est encore un singleton) ou ne GetInstance
en créer un nouveau?
Est-il préférable d'utiliser le local _ambientContainer
champ à la place?
get {
return _ambientContainer.Resolve<Application.StateContext>();
}
Merci.
OriginalL'auteur zero51 | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que le
ServiceLocator
type est à partir de la CommonServiceLocator projet, et que vous êtes à l'aide de l'Unité de l'adaptateur, auquel casGetInstance
appellecontainer.Resolve
, de sorte que les deux lignes sont équivalentes.Vous pouvez voir la source ici - http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home
OriginalL'auteur
Passant autour des instances du conteneur à la consommation des classes n'est généralement pas une bonne idée, car vous n'êtes plus assuré de disposer d'un unique place dans votre application où les composants et les services sont enregistrés (connu sous le nom Composition de la Racine).
Classes doivent faire état de leurs dépendances dans leur API publique, idéalement par précisant que les arguments du constructeur, le conteneur va automatiquement donner un exemple pour chaque fois qu'il est demandé de résoudre un type spécifique (un processus connu sous le nom permettra à l'autowiring).
L'Injection De Dépendance est généralement le choix préféré mais il n'est pas toujours le cas. Dans ces cas, l'aide d'un Service Locator, comme vous le faites dans votre exemple, est le meilleure solution à dissocier une classe à partir de ses dépendances.
En conclusion, si l'Injection de Dépendance n'est pas une option, je voudrais éviter d'avoir mes cours de référence de l'emballage directement et au lieu d'avoir accès à elle par l'intermédiaire d'un Service de localisation.
OriginalL'auteur
De préférence, vous devriez éviter à la fois les façons de (ab)à l'aide de votre conteneur.
La ServiceLocator est considéré comme un anti-modèle dans l'application moderne de l'architecture.
Une alternative à ce code? De la lecture? Ou de l'enregistrement de
Application.StateContext
? L'auteur n'a pas dit quel genre d'application qu'il utilise (asp.net/mcv, winforms, wpf, console, wcf ...) donc je ne peux pas vous dire de mettre le code d'enregistrement. Chaque type d'application est différent de composition de la racine. Comme pour l'appel au service locator: faire de laStateContext
un ctor paramètre de ces classes qui en ont besoin. Qui fait de la dépendance explicite et interchangeables (par exemple pour les tests).Tout modèle est un anti modèle si votre utilisation de la mauvaise façon. TOUS les DI bibliothèques utilisent le service de localisation sous les couvertures, sinon, ils ne fonctionnent pas. Ne croyez pas tout ce que vous lisez sur internet!
Oui, à un certain point, nous devons faire appel à une mise en œuvre effective de la classe pour recevoir une instance d'un type. Franchement, pourquoi ne pas Microsoft faire cuire ce Système.Activateur.CreateInstance<T> ??? Je veux dire zut alors, nous avons tous, en manque une aveuglément solution simple ici?????
OriginalL'auteur