Dependencia de inyección wcf

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

Cuando use svcutil.exe o el asistente Agregar referencia de servicio en Visual Studio, uno de los muchos tipos autogenerados será una interfaz de cliente. Vamos a llamarlo IMyService . También habrá otra interfaz autogenerada llamada algo así como IMyServiceChannel que implementa IMyService e IDisposable. Use esta abstracción en el rest de su aplicación cliente.

Como desea poder crear un nuevo canal y cerrarlo nuevamente, puede presentar una Abstract Factory:

 public interface IMyServiceFactory { IMyServiceChannel CreateChannel(); } 

En el rest de su aplicación cliente, 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 implementación concreta de IMyServiceFactory que envuelva ChannelFactory WCF como una implementación:

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

Ahora puede configurar su contenedor DI asignando IMyServiceFactory a MyServiceFactory. Así es como se hace en Castle Windsor:

 container.Register(Component .For() .ImplementedBy()); 

Información adicional: Aquí se explica cómo conectar un servicio WCF con un Contenedor DI .

Esto es lo que entiendo de su pregunta:

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

Usted tiene un cliente WCF que usó un servicio. Llamemos al contrato de servicio: IServicio

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 usar el hecho de que la clase ServiceClient está marcada como parcial.

Simplemente haga otra statement 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 { } } 

Espero que haya ayudado.