2016-08-23 45 views
0

我有一個WCF服務,需要5分鐘才能從數據庫加載所有內容。我想從WCF中獲得最好的性能,並且發現這篇文章http://theburningmonk.com/2010/05/wcf-improve-performance-with-greater-concurrency/ 它聲明我將使用PerCall獲得更好的性能。我有每秒2000到4000點擊的地方。將InstanceContextMode.Single轉換爲InstanceContextMode.PerCall

我的問題是加載數據需要很長時間。每篇文章都說使用靜態變量爲真正的服務創建一個包裝器。 我不知道這是怎麼樣,我不知道什麼_container真的是。 有人可以給我一個完整的例子嗎?

在初始化步驟是漫長的和不可避免的,或者你的類需要在構造函數中的一些參數(例如,當您以編程方式託管服務從IoC容器中檢索)的參數的構造函數可以成爲案件問題。爲了解決這個問題,你可以爲你的類的包裝和揭露包裝的服務,而不是,但保持其所有的請求被傳遞到底層服務的靜態實例:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class MyServiceWrapper : IMyServiceWrapper 
{ 
    // get the underlying service from the container 
    private static IMyService MyService = _container.Resolve<IMyService>(); 


public MyServiceWrapper() 
{ 
    // parameterless constructor which does nothing, so easy to constructor 
} 
public void DoSomething() 
{ 
    MyService.DoSomething(); 
} 

}

// dummy interface to ensure the wrapper has the same methods as the underlying service 
// but helps to avoid confusion 
public interface IMyServiceWrapper : IMyService 
{ 
} 

對於sessionful的服務,PerSession實例上下文模式使 你PerCall實例上下文模式,並在 同時所有的好處減少你付了前開銷tra併發性 ,因爲您的類的新實例不再爲每個 請求創建,而是爲每個會話創建。

+0

我_container這裏猜測是IOC容器,代碼行正試圖解決的IMyService實例。如果您不使用IOC容器,則可以返回服務的實例。 –

+0

所以所有的包裝的東西可以忽略,我可以做到這一點? [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall, AddressFilterMode = AddressFilterMode.Any)] 公共類撥號方案:IDialPlan { 內部靜態SonicSBCRouting S = NULL; public DialPlan() { Start(); } 公共無效啓動() {如果(一個或多個== NULL) S =新SonicSBCRouting(); s.Startup(); } –

回答

1

您可以從IOC容器取出取服務對象的邏輯:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
    public class MyServiceWrapper : IMyServiceWrapper 
    { 
     // get the underlying service from the container 
     private static IMyService myService = new MyService(); 


     public MyServiceWrapper() 
     { 
      // parameterless constructor which does nothing, so easy to constructor 
     } 
     public void DoSomething() 
     { 
      myService.DoSomething(); 
     } 
    } 

    // dummy interface to ensure the wrapper has the same methods as the underlying service 
    // but helps to avoid confusion 
    public interface IMyServiceWrapper : IMyService 
    { 
    } 
相關問題