2009-07-24 14 views
10

ślad za przy użyciu iniekcji zależnościach dla WCF services, czy jest jakiś sposób korzystania DI dla WCF weryfikatorów, tak, że można to zrobić:Jak wstrzykiwać obiektu do klasy WCF walidatora

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 - Próbowałem zastosować sugestię Dzmitry'ego do mojego niestandardowego rozszerzenia zachowania, ponieważ mój walidator jest zdefiniowany w app.config. Niestety ja dostaję MethodMissingException, ponieważ WCF chce mój walidator mieć domyślnego konstruktora:

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)

Oto moja klasa zachowanie:

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

Co to jest "Walidator WCF"? –

+0

Nie wiem, jak inaczej to nazwać. Jeśli chcesz, abym był konkretnym "walidatorem wcf" w tym przypadku byłaby to niestandardowa implementacja UserNamePasswordValidator. –

+0

John. Dlaczego jesteś taki zarozumiały? Mógłbym być taki, gdybym miał ponad 56 000 punktów rep, ale wydajesz się być protekcjonalny. Te opinie pochodzą nie tylko z tego posta, ale także z innych odpowiedzi i wątków, w które zaangażowałeś się, w niektórych przypadkach, gdy postradałeś zmysły. – SideFX

Odpowiedz

1

wiem, że to nie jest rozwiązanie, którego szukasz, ale utworzyłbym domyślny konstruktor, który dostałby IService z twojego kontenera IoC (lokalizator usług zamiast DI). Nie jest to najmilszy sposób, ale najprościej myślę.

Edycja: oczywiście można pozostawić konstruktora, który pozwala wstrzykiwać zależność, jeśli chcesz kpić z IService do testowania lub jakiegokolwiek innego celu.

+0

Zazwyczaj robię to, gdy nie ma innej dostępnej opcji - pozostawić zwykłego konstruktora i dostarczyć drugi konstruktor bez parametrów, który wywołuje oryginał, używając argumentów ServiceLocator. – AlexFoxGill

3

Generalnie niestandardowy weryfikator jest przypisywany programowo (istnieje również możliwość zrobienia tego z pliku konfiguracyjnego), podobnie jak to, i odbywa się tuż przed otwarciem hosta usługi i zasadniczo jest to również czas utworzenia instancji kontenera DI, będą dalej wykorzystywane do instancji serwisowych przez instancji dostawcy:

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

można także użyć DI pojemnik stworzyć swój własny walidator jak również.

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

Cool, czy istnieje sposób przypisywania typu sprawdzania poprawności w app.config i tworzenie instancji typu sprawdzania poprawności z instancji IServiceBehaviour? Próbowałem ustawić CustomUserNamePasswordValidator z mojej niestandardowej klasy zachowania, ale otrzymuję wyjątek czasu wykonywania po uruchomieniu mojej usługi WCF. –

+0

Czy możesz podać mi przykład kodu i szczegóły wyjątku, a spróbuję ci pomóc. –

+0

OK, teraz edytowałem moje pytanie. –

Powiązane problemy