2013-06-27 19 views
3

我想用自定義構造函數來使用流利配置的MEF來提升我的WCF服務。如何將流利的MEF注入WCF

如何檢查MEF容器是否提供「serviceType」。例如:

public class MyServiceHostFactory : ServiceHostFactory 
    { 
     private readonly CompositionContainer container; 
     public MyServiceHostFactory() 
     { 
      this.container = MyCompositionRoot.Instance.Container; 

     } 
     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      if (serviceType == ????) 
      { 
       return new MyServiceHost(container, serviceType, baseAddresses); 
      } 
      return base.CreateServiceHost(serviceType, baseAddresses); 
     } 

    } 

,然後我需要一個實例提供程序添加到我的行爲:

public MyServiceHost(CompositionContainer container, Type serviceType, 
          params Uri[] baseAddresses) : base(serviceType, baseAddresses) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException("container"); 
     } 
     var contracts = this.ImplementedContracts.Values; 
     foreach (var c in contracts) 
     { 
      // Should I get the service obj here? 
      var serviceObj = container.GetExports(serviceType, null, null).First().Value; 

      var instanceProvider = new MyInstanceProvider(serviceObj); // ???? 
      c.Behaviors.Add(instanceProvider); 
     } 
    } 

,但我不知道這種情況下供應商應該如何看(它應該採取serviceType作爲一個參數或所述serviceObj

public partial class MyInstanceProvider : IInstanceProvider, IContractBehavior 

因爲在書(DI噴射在.NET)的例子中使用了強耦合實例提供的,即MyServiceType1InstanceProviderMyServiceType2InstanceProvider - 但如果我有很多服務與流暢的mef聯繫在一起,那會很乏味。

回答

1

要做到這一點的一種方法是使用CompositionContainerGetExports方法。它返回一個IEnumerable<Lazy<Object, Object>>。如果它至少包含一個元素,則「serviceType」可用。

所以檢查可以是:

if (container.GetExports(serviceType, null, null).Any()) 
{ 
    return new MyServiceHost(container, serviceType, baseAddresses); 
} 

那麼一種方式來獲得導出的服務可以是:

Object seviceObj = container.GetExports(serviceType, null, null).First().Value; 

現在的問題是,價值是System.Object類型可以將你必須投它dynamically或使用dynamic關鍵字(並釋放編譯器的所有幫助)。

+0

謝謝,這有幫助。至少我現在有一種做法! – drozzy

+0

謝謝,你能看看我更新的問題,看看你是否可以告訴我如何進行? – drozzy

0

WCF服務默認爲每個呼叫實例模式。這意味着爲每個傳入方法調用實例化WCF服務的新實例。這聽起來像你想要的是單身實例模式,但如果可能性是個問題,你真的想避免這種情況。

我得到這個的方式是使用per call實例模式,但在同步訪問的場景後面有一個靜態數據存儲區。這至少允許客戶端進行連接,即使連接建立後數據存儲區正在使用時它們必須暫時阻止。

有關更多詳細信息,請參閱System.ServiceModel.InstanceContextMode上的MSDN幫助。