2010-06-09 374 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 
    { 
    } 
} 

希望它有幫助。