2013-07-10 160 views
4

我創建了一個WCF服務,它從數據庫中讀取並返回結果。出於性能原因,我想緩存服務啓動時的表(這發生在Windows服務OnStart中)。但是有作爲構造在WCF中沒有這樣的事情(?右),所以最好的事情,我想出了是創建一個init()函數,並調用類似如下:WCF初始化代碼

protected override void OnStart(string[] args) 
{ 
    mServiceHost = new ServiceHost(typeof(DLSService.DLSService), new Uri("http://localhost:8000/DLS")); 
    mServiceHost.AddServiceEndpoint(typeof(DLSService.IDLSService), new BasicHttpBinding(), "ServicesHost"); 
    ((DLSService.DLSService)mServiceHost.SingletonInstance).Init(); 
    mServiceHost.Open(); 
} 

但使用SingletonInstance和鑄造到正確的類型對我來說似乎不是那麼重要。 有沒有更好的方法來實現構造函數在WCF中的功能?

回答

3

建議的最佳做法是在WCF中使用每個呼叫激活模型的並使服務完全無狀態。

這意味着:每次客戶端發出請求時,在服務器端,您的服務實現類的實例將被創建,請求的服務調用將被創建,然後服務類將再次被銷燬。因此,將初始化代碼放入服務實現類構造函數中將是一個非常糟糕的主意 - 它會針對每個請求執行。

你可以做的是擁有某種邏輯(無論是在你的服務類還是某些支持代碼中,例如某種管理界面),這些邏輯會將你想要緩存的表加載到持久緩存中,例如,像AppFabric緩存。一旦完成,處理請求的多個服務實例可以使用該公共緩存來獲得更好的性能。

+1

好點。使用一個服務實例,您將很難編寫錯誤處理。如果服務器處於故障狀態,則需要在每次呼叫時編寫恢復代碼。通過每個通話服務,您只需關閉故障服務並重新啓動一個服務即可。 – Peter

1

您可以使用IInstanceProvider界面來創建您的服務,請閱讀this文章以獲取更多信息。 下面是代碼的例子:

public class CustomInstanceProvider:IInstanceProvider 
{ 

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

    public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message) 
    { 
     return new DLSService.DLSService(); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    {    
    } 
} 

var mServiceHost = new ServiceHost(typeof(DLSService.DLSService), new Uri("http://localhost:8000/DLS")); 
mServiceHost.AddServiceEndpoint(typeof(DLSService.IDLSService), new BasicHttpBinding(), "ServicesHost"); 

foreach (var channelDispatcher in mServiceHost.ChannelDispatchers.OfType<ChannelDispatcher>()) 
{ 
    foreach (var endpointDispatcher in channelDispatcher.Endpoints) 
    { 
     endpointDispatcher.DispatchRuntime.InstanceProvider = new CustomInstanceProvider(); 
    } 
} 
mServiceHost.Open(); 
3

這可以用一個memoization庫來解決,如MbCache。我們正在做你正在尋找的東西;在應用程序啓動時,我們調用要緩存的每個服務操作,並且MbCache緩存連續調用的結果(即無數據庫往返以獲取結果),直到緩存過期。

MbCache的確具有公平的複雜性,但一旦它運行起來,它就能很好地工作,併爲我們處理所有的緩存邏輯。