2014-10-28 61 views
0

我們有一個WCF服務暴露與basicHttpBinding的和服務實現的一些操作是這樣的如何避免不必要的對象越來越初始化WCF

Public Class MyService 
{ 

    private IHandler1 _handler1 = GetHandler1(); 
    private IHandler2 _handler1 = GetHandler12(); 
    private IHandler3 _handler1 = GetHandler3(); 


Public Void HandleMessage(string msg) 
{ 
    _handler1.SomeMethod(); 
} 



Public Void HandleMessage(string msg) 
{ 
    _handler1.SomeMethod(); 
} 
Public Void HandleMessage2(string msg) 
{ 
    _handler2.SomeMethod(); 
} 

Public Void HandleMessage2(string msg) 
{ 
    _handler3.SomeMethod(); 
} 



} 

但有些東西的問題,我用這個代碼中看到,所有的處理程序即使當我們收到一個請求來處理其中的一個消息,我的意思是當客戶端調用HandleMmessage2()方法時,只有處理程序_handler2應該初始化,所以即使處理程序1/2/3 也得到初始化。什麼是實現這一目標的最佳方式?

由於該服務使用BasicHttpbinding公開了不支持Sessions的端點,因此InstanceContextMode將是PerCall,它會創建所有處理程序,即使不需要來自客戶端的請求時也是如此。

+1

爲什麼不在需要它的方法中創建處理程序?即public void HandleMesage(string msg){_handler1 = GetHandler1(); _handler1.SomeMethod(); }' – Tim 2014-10-28 08:28:18

+0

謝謝@Tim,但有沒有其他方式做延遲加載 – CSharped 2014-10-28 08:30:46

+0

可能有,但這是最簡單的方法。有沒有要求阻止你這樣做? – Tim 2014-10-28 08:35:04

回答

0

也許我誤解了一些東西,但爲什麼不用他們需要的方法創建處理程序呢?然後你的實現看起來像這樣:

public class MyService 
{ 

    public void HandleMessage(string msg) 
    { 

     IHandler1 _handler = GetHandler1(); 
     _handler.SomeMethod(); 
    } 

    public void HandleMessage2(string msg) 
    { 
     IHandler2 _handler = GetHandler(); 
     _handler.SomeMethod(); 
    } 

    public void HandleMessage3(string msg) 
    { 

     IHandler3 _handler = GetHandler3(); 
     _handler.SomeMethod(); 
    } 
} 
+0

是的,這是處理場景的方式,因爲您在類級別聲明處理程序,所有類級別的變量都將針對每個請求進行初始化。如果您使用BasicHttpBinding,則默認環境模式將爲PerCall http://dotnetmentors.com/wcf/instance-management-using-instancecontextmode-property-in-wcf.aspx – Laxmikant 2014-10-29 06:16:02