2009-07-24 2 views
10

Im Anschluss an unter Verwendung von Dependency Injection für WCF services zu injizieren, ist es eine Möglichkeit, DI der Verwendung für WCF Validatoren, so dass man dies tun könnte:Wie ein Objekt in eine WCF-Validator-Klasse

public class DIValidator : UserNamePasswordValidator 
{ 
    private readonly IService service; 

    [Inject] 
    public DIValidator(IService service) 
    { 
     this.service = service; 
    } 

    public override void Validate(string userName, string password) 
    { 
     service.Login(userName, password); 
    } 
} 

EDIT - Ich habe versucht, den Ratschlag von Dzmitry auf meine benutzerdefinierte Verhaltenserweiterung anzuwenden, da mein Validator in app.config definiert ist. Ich bekomme leider ein MethodMissingException, da wcf mein Validator will einen Standardkonstruktor haben:

System.MissingMethodException: No default constructor has been defined for this object.

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, BooleannoCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)

Hier ist mein Verhalten Klasse:

public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior 
    { 
     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      serviceHostBase.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = DISupport.Kernel.Get<IService>(); 
     } 
    } 
+0

Was ist ein "WCF Validator"? –

+0

Ich weiß nicht, wie ich es sonst nennen soll. Wenn Sie möchten, dass ich in diesem Fall spezifisch ein "wcf validator" bin, wäre das eine benutzerdefinierte Implementierung eines UserNamePasswordValidator. –

+0

John. Warum bist du so großspurig? Ich könnte auch so sein, wenn ich mehr als 56.000 Rep-Punkte hätte, aber Sie gehen irgendwie herablassend aus. Diese Meinungen stammen nicht nur von diesem Beitrag, sondern auch von anderen Antworten und Themen, an denen Sie beteiligt waren, wobei Sie in einigen Fällen brutal und gemein sind. – SideFX

Antwort

1

Ich weiß, das ist nicht die Lösung, die Sie suchen, aber ich würde einen Standardkonstruktor erstellen, der IService von Ihrem IoC-Container (Service Locator anstelle von DI) erhalten würde. Nicht die schönste Art, das zu tun, aber die einfachste, die ich mir vorstellen kann.

Edit: Natürlich können Sie den Konstruktor verlassen, der es Ihnen erlaubt, die Abhängigkeit zu injizieren, wenn Sie den IService zum Testen oder irgendeinen anderen Zweck verspotten müssen.

+0

Ich tendiere dazu, wenn keine andere Option verfügbar ist - lasse den regulären Konstruktor und stelle einen zweiten parameterlosen Konstruktor bereit, der das Original mit ServiceLocator'ed Argumenten aufruft. – AlexFoxGill

3

Im Allgemeinen benutzerdefinierte Validator wird programmgesteuert zugewiesen (es gibt auch die Möglichkeit, dies aus der Konfigurationsdatei zu tun) so etwas und es erfolgt kurz bevor Service-Host geöffnet ist und im Grunde das ist auch die Zeit, die Sie Ihre DI-Container-Instanz erstellen weiter zu Service-Instanzen durch Instanz-Anbieter verwendet werden:

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator(); 

Sie können auch verwenden DI-Container Ihren benutzerdefinierten Validator als auch zu schaffen.

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>(); 
+0

Cool, gibt es eine Möglichkeit, den Validator-Typ in app.config und Instanziieren des Validatortyps von einer IServiceBehaviour-Instanz? Ich habe versucht, den CustomUserNamePasswordValidator von meiner benutzerdefinierten Verhaltensklasse zu setzen, aber ich bekomme eine Laufzeitausnahme, wenn ich meinen WCF-Dienst starte. –

+0

Könnten Sie mir bitte Codebeispiel und Ausnahmedetails geben und ich werde versuchen, Ihnen zu helfen. –

+0

Okay, jetzt habe ich meine Frage bearbeitet. –

Verwandte Themen