2014-10-28 23 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