2009-07-24 7 views
10

Siguiendo con el uso de la inyección de dependencias para WCF services, ¿hay alguna manera de utilizar DI para WCF validadores, por lo que se podía hacer esto:Cómo inyectar un objeto en una clase de validador WCF

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); 
    } 
} 

EDITAR - Intenté aplicar el consejo de Dzmitry a mi extensión de comportamiento personalizado, ya que mi validador está definido en app.config. Lamentablemente consigo un MethodMissingException, ya WCF quiere mi validador para tener un constructor por defecto:

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)

Aquí es mi clase de comportamiento:

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

¿Qué es un "Validador de WCF"? –

+0

No sé qué más llamarlo. Si quiere que sea específico, un "validador wcf" en este caso sería una implementación personalizada de UserNamePasswordValidator. –

+0

John. ¿Por qué eres tan arrogante? También podría ser así si tuviera más de 56,000 puntos de repetición, pero en cierto modo eres condescendiente. Estas opiniones no solo provienen de esta publicación, sino también de otras respuestas y temas en los que ha estado involucrado, en los que, en algunos casos, se muestra brutal y malintencionado. – SideFX

Respuesta

1

Sé que esto no es la solución que está buscando, pero crearía un constructor predeterminado que obtendría IService de su contenedor IoC (localizador de servicio en lugar de DI). No es la mejor manera de hacer esto, pero lo más simple que puedo pensar.

Editar: por supuesto, puede dejar el constructor que le permite inyectar la dependencia, si necesita simular el servicio de IService para realizar cualquier prueba o cualquier otro propósito.

+0

Tiendo a hacer esto cuando no hay otra opción disponible - abandone el constructor regular y proporcione un segundo constructor sin parámetros que llame al original usando los argumentos del ServiceLocatored – AlexFoxGill

3

En general, el validador personalizado se asigna programáticamente (también existe la posibilidad de hacerlo desde el archivo de configuración) y se realiza justo antes de que se abra el host de servicio y básicamente esta es la vez que crea su instancia de contenedor DI se utilizará más a través de las instancias de servicio proveedor de instancias:

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

puede también utilizar contenedor de DI para crear su validador personalizado también.

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

Cool, ¿hay alguna forma de asignar el tipo de validador en app.config y instanciando el tipo de validador de una instancia IServiceBehaviour? Traté de configurar el CustomUserNamePasswordValidator de mi clase de comportamiento personalizado, pero obtengo una excepción de tiempo de ejecución cuando inicio mi servicio WCF. –

+0

¿Podría darme ejemplos de códigos y excepciones e intentaré ayudarlo? –

+0

Bien, ahora he editado mi pregunta. –

Cuestiones relacionadas