2010-06-09 251 views
5

我想在WCF中注入我的接口的实现,但我想在WCF的客户端中初始化我的依赖注入容器。因此,我可以为我的服务的每个客户端提供不同的实施。依赖注入wcf

回答

16

当您使用svcutil.exe的添加服务引用向导在Visual Studio中,许多类型的自动生成的将是客户端接口之一。我们称之为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<T>作为一种实现:

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

您现在可以通过将IMyServiceFactory映射到MyServiceFactory来配置您的DI容器。下面是它是如何在温莎城堡进行:

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

奖金信息:这里是how to wire up a WCF service with a DI Container

+1

好的,但我如何做到在服务中注入一个类的自定义实现?示例:public interface ISendMail {seng(string subject,string message,string to); }。我想为每个客户端实现一个不同的类,并在客户端中将此实现注入到WCF服务中。 Tks – 2010-06-11 18:04:53

+0

该代码可能不会表现出圈复杂性或任何其他流行词,但我知道的是,以目前的形式,如果您有多个感兴趣的服务,则需要大量的连接。 IMO需要一个更通用的方法来实现更大的项目。 – brumScouse 2013-05-27 13:20:59

+2

你继续使用这个词。我不认为这意味着你的想法。 – 2013-05-27 16:47:22

1

以下是我从你的问题的理解:

您有不与WCF的接口。我们称之为IInterface

您有一个使用服务的WCF客户端。让我们打电话给服务合同:IService

您希望ServiceClient类在缺省情况下在添加服务引用时也实现IService以实现IInterface。

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

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

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

希望它有帮助。