2010-06-09 18 views
5

Quiero inyectar una implementación de mi Interfaz en el WCF, pero quiero inicializar mi contenedor de Inyección de Dependencia en el Cliente del WCF. Entonces puedo tener una implementación diferente para cada cliente de mi servicio.Inyección de Dependencia wcf

Respuesta

16

Cuando se utiliza svcutil.exe o la Agregar referencia de servicio asistente en Visual Studio, uno de los muchos tipos generada automáticamente será una interfaz de cliente. Llamémoslo IMyService. También habrá otra interfaz autogenerada llamada algo así como IMyServiceChannel que implementa IMyService e IDisposable. Use esta abstracción en el resto de su aplicación cliente.

Puesto que usted quiere ser capaz de crear un nuevo canal y cerrarla de nuevo, puede introducir una fábrica Resumen:

public interface IMyServiceFactory 
{ 
    IMyServiceChannel CreateChannel(); 
} 

En el resto de la aplicación cliente, se puede tomar una dependencia de IMyServiceFactory:

public class MyClient 
{ 
    private readonly IMyServiceFactory factory; 

    public MyClient(IMyServiceFactory factory) 
    { 
     if (factory == null) 
     { 
      throw new ArgumentNullException("factory"); 
     } 

     this.factory = factory; 
    } 

    // Use the WCF proxy 
    public string Foo(string bar) 
    { 
     using(var proxy = this.factory.CreateChannel()) 
     { 
      return proxy.Foo(bar); 
     } 
    } 
} 

puede crear una aplicación concreta de IMyServiceFactory que envuelve WCF de ChannelFactory<T> como una implementación:

public MyServiceFactory : IMyServiceFactory 
{ 
    public IMServiceChannel CreateChannel() 
    { 
     return new ChannelFactory<IMyServiceChannel>().CreateChannel(); 
    } 
} 

Ahora puede configurar su contenedor DI asignando IMyServiceFactory a MyServiceFactory. Así es como se hace en el castillo de Windsor: información

container.Register(Component 
    .For<IMyServiceFactory>() 
    .ImplementedBy<MyServiceFactory>()); 

Bonus: Aquí está how to wire up a WCF service with a DI Container.

+1

Bien, pero ¿cómo hago para inyectar en servicio una implementación personalizada de una clase? Ejemplo: interfaz pública ISendMail {seng (asunto de cadena, mensaje de cadena, cadena a); }. Quiero implementar una clase diferente para cada cliente y en el cliente, inyectar esta implementación en el Servicio WCF. Tks –

+0

El código puede no mostrar complejidad ciclomática o cualquier otra palabra de moda, pero lo que sí sé es que, tomado en su forma actual, esto requiere mucha conexión si tiene más de unos pocos servicios que le interesan. requiere un enfoque más genérico para valer la pena en proyectos más grandes, IMO. – brumScouse

+2

Sigues usando esa palabra. No creo que signifique lo que piensas que significa. –

1

Aquí es lo que entiendo de su pregunta:

Usted tiene una interfaz que no está relacionado con WCF. Vamos a llamarlo IInterface

Tiene un cliente WCF que utilizó un servicio. Llamemos al contrato de servicio: IService

desea la clase ServiceClient que implemente de forma predeterminada IService cuando agrega una referencia de servicio también para implementar IInterface.

Si este es el caso, puede utilizar el hecho de que la clase ServiceClient está marcada como parcial.

Simplemente haga otra declaración parcial para ServiceClient y agregue la interfaz que necesita (Debe asegurarse de que los espacios de nombres sean iguales para el código generado automáticamente y su código). Debería verse algo así como:

namespace [ServiceClient Namespace] 
{ 
    public partial class ServiceClient : IInterface 
    { 
    } 
} 

Hope it help.

Cuestiones relacionadas