1

J'utilise un UserNamePasswordValidator dans WCF avec Unity pour mon injection de dépendance, mais depuis que WCF crée l'instance de UserNamePasswordValidator, je ne peux pas injecter mon conteneur dans la classe. Alors, comment pourrait-on s'y prendre?Comment injecter des dépendances dans un UserNamePasswordValidator personnalisé dans WCF?

La solution la plus simple que je peux penser est de créer une classe proxy/wrapper statique autour d'une instance statique d'UnityContainer, qui expose toutes les mêmes méthodes ... De cette façon, toute classe peut accéder au conteneur, et je Pas besoin de l'injecter partout.

Donc je pourrais simplement faire UnityContainerWrapper.Resolve() n'importe où dans le code. Donc, fondamentalement, cette solution résout 2 problèmes pour moi, je peux l'utiliser dans des classes dont je ne crée pas une instance, et je peux l'utiliser n'importe où sans avoir à injecter le conteneur dans un tas de classes. Le seul inconvénient que je peux penser est que je suis maintenant potentiellement exposer mon conteneur à un tas de classes qui n'auraient pas eu accès au conteneur avant. Pas vraiment sûr si c'est même un problème si?

Répondre

1

Oui, ce site est vraiment mauvais, et vous devriez l'éviter. Dans votre cas, vous pouvez faire quelque chose comme ça

public class CustomUserNameValidator : UserNamePasswordValidator 
    { 
     public static CustomUserNameValidator Current { 
      get; private set; 
     } 

     public CustomUserNameValidator() { 
      Current = this; 
     } 

     public override void Validate(string userName, string password) 
     { 
      throw new FaultException("No pasaran"); 

     } 

     [Dependency] 
     public ISomeService Service { 
      get; set; 
     } 
    } 

Il sera créé qu'une seule fois pour le service lorsque l'hôte de service est créé, vous devez écrire le code suivant

using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))) //here it will be created 
      { 
       container.BuildUp(CustomUserNameValidator.Current); //here you can inject all you need 
      } 

Ceci est juste idée inversée avec statique wrapper du conteneur de l'unité :)

+0

J'héberge via IIS, donc je devine que je pourrais faire le BuildUp dans le constructeur du contrat de service. Mais il y a toujours un inconvénient à cela, vous devez exposer publiquement votre service ... Mais je suppose que c'est beaucoup mieux que d'exposer le conteneur entier. – Dannerbo

+0

Sur une autre note ... Puisque j'utilise un fichier de configuration pour mapper tous mes objets pour Unity, est-ce que mon idée statique originale est toujours un problème? Supposons que je n'utilise pas une classe wrapper statique autour d'une instance de conteneur unitaire, je pourrais toujours créer un nouveau UnityContainer n'importe où dans le code et le configurer en utilisant le fichier config et créer les objets que je voulais. Donc, je ne suis pas sûr que l'idée de UnityContainerWrapper crée même un "problème", c'est juste de rendre un problème existant plus visible? Si cela a du sens ... – Dannerbo

+0

probablement, vous avez plusieurs assemblages, mais un seul est conscient de Unity - le plus haut niveau, donc d'autres ne peuvent pas créer unitcontainer du tout. La deuxième chose est la gestion de la vie. J'ai vraiment besoin de créer deux conteneurs avec des singletons, parce que vous pouvez obtenir l'ensemble des autres comportements que vous attendez. C'est donc une sorte de choses conventionnelles, mais cela rend un tel scénario très peu aimable. –

Questions connexes