dependency injectionwcf

我想在WCF中注入我的接口的实现,但我想在WCF的客户端初始化我的容器的dependency injection。 所以我可以为我的服务的每个客户端提供不同的实现。

在Visual Studio中使用svcutil.exe或“ 添加服务引用”向导时,自动生成的许多类型之一将是客户端界面。 我们称之为IMyService 。 还会有另一个自动生成的接口,称为IMyServiceChannel ,它实现了IMyService和IDisposable。 在客户端应用程序的其余部分中使用此抽象。

由于您希望能够创建新频道并再次关闭它,因此您可以引入抽象工厂:

 public interface IMyServiceFactory { IMyServiceChannel CreateChannel(); } 

在客户端应用程序的其余部分中,您可以依赖于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); } } } 

您可以创建一个IMyServiceFactory的具体实现,它将WCF的ChannelFactory包装为一个实现:

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

您现在可以通过将IMyServiceFactory映射到MyServiceFactory来配置DI容器。 以下是在温莎城堡中的表现:

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

奖励信息:以下是如何使用DI容器连接WCF服务 。

以下是我从您的问题中理解的内容:

您有一个与WCF无关的接口。 我们称之为IInterface

您有一个使用服务的WCF客户端。 我们叫服务合同:IService

您希望ServiceClient类在添加服务引用时默认实现IService,以实现IInterface。

如果是这种情况,您可以使用ServiceClient类标记为partial的事实。

只需为ServiceClient创建另一个部分声明并添加所需的接口(您必须确保命名空间对于自动生成的代码和代码是相同的)。 看起来应该是这样的:

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

希望它有所帮助。