0

我使用的是一個揭示簡單實體框架模型的vanilla WCF DataService類。該服務包含在發佈到IIS的簡單Web應用程序中。沒有什麼奇特的,對!如何使用MEF擴展WCF DataServices和EntityFramework模型

我想建立什麼MSDN描述這樣

請求和應用範圍在MVC應用程序創建 部分
實例中的兩個作用域之一存在:請求範圍或應用程序 範圍。默認情況下,在Web請求期間創建的部分實例位於請求範圍內。 相同請求中的部分實例是共享的,因此如果多個部分導入給定的 部分,則所有導入器都會收到對同一實例的引用。每個網頁 請求都有其自己的範圍,因此在一個請求中創建的部分絕不會是用於在另一個請求中填充導入的 。當請求結束時,其關聯範圍將被銷燬,併爲其創建的任何零件被銷燬 。部署實現一個IDisposable對象的部件已經處理完畢。 這可確保敏感資源(如數據庫連接, )正確關閉。有時,您可能不希望爲每個請求創建一個 實例(例如,當您實施應用程序範圍的 緩存時)。在這些情況下,您可以通過應用ApplicationScoped屬性強制在 應用程序作用域中創建零件。應用程序中的部件 始終由應用程序中的所有請求共享。 應用範圍中的一部分可能僅依賴於其導入應用範圍中的其他部分。應用範圍 中的零件必須小心以保證線程安全。

其中一個主要問題是我不知道在哪裏創建RequestScope容器。我認爲RequestScope容器應該在DataService類之外構建,對吧?

任何幫助就在你需要類似情況appredicated

回答

1

,我有我已經張貼在這裏

public class MefDataServiceHostFactory : DataServiceHostFactory 
    { 
     protected override ServiceHost CreateServiceHost(
      Type serviceType, Uri[] baseAddresses) 
     { 
      ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses); 
      host.Description.Behaviors.Add(new MefServiceBehavior()); 
      return host; 
     } 
    } 

    public class MefInstanceProvider : IInstanceProvider 
    { 
     #region fields 

     private readonly Type _serviceType; 
     private IDependencyScope _diScope; 

     #endregion 

     #region ctor 

     public MefInstanceProvider(Type serviceType) 
     { 
      _serviceType = serviceType; 
     } 

     #endregion 

     public object GetInstance(InstanceContext instanceContext) 
     { 
      return GetInstance(instanceContext, null); 
     } 

這裏來,其中一個可使用MEF或重要部分工作解決方案什麼是IOC。

 public object GetInstance(InstanceContext instanceContext, Message message) 
     { 
      _diScope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope(); 
      return _diScope.GetService(_serviceType); 
     } 

     public void ReleaseInstance(InstanceContext instanceContext, object instance) 
     { 
      if (_diScope != null) _diScope.Dispose(); 
     } 
    } 

獲取一個新的實例和處置要求

public class MefServiceBehavior : IServiceBehavior 
    { 
     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) 
      { 
       var cd = cdb as ChannelDispatcher; 
       if (cd != null) 
       { 
        foreach (EndpointDispatcher ed in cd.Endpoints) 
        { 
         ed.DispatchRuntime.InstanceProvider = new MefInstanceProvider(serviceDescription.ServiceType); 
        } 
       } 
      } 
     } 

     public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
             Collection<ServiceEndpoint> endpoints, 
             BindingParameterCollection bindingParameters) 
     { 
     } 

     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
     } 
    } 

註冊自定義工廠在SVC文件

<%@ServiceHost Service="DataService" 
       Factory="MefDataServiceHostFactory" 
       language=c# Debug="true" %> 

或添加新的服務途徑。

routes.Add(new ServiceRoute(string.Empty, new MefDataServiceHostFactory(), typeof (DataService))); 

快樂編碼!