2014-10-28 3 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(); 
} 



} 

Но этот вопрос я вижу с этим кодом, что все обработчики инициализируются, т.е. handler1/2/3 , даже когда мы получаем запрос на обработку одного из сообщений, которые я имею в виду, когда клиент вызывает метод HandleMmessage2(), только обработчик _handler2 должен быть инициализирован. Каков наилучший способ добиться этого?

Поскольку служба разоблачает конечную точку с помощью BasicHttpbinding, которая не поддерживает сеансы, InstanceContextMode будет PerCall, который создает все обработчики, даже если это не требуется для запроса evert от клиента.

+1

Почему бы не создать обработчик в методе, который его требует? т. е. 'public void HandleMesage (строка msg) {_handler1 = GetHandler1(); _handler1.SomeMethod(); } ' – Tim

+0

Спасибо @Tim, но есть ли другой способ делать Lazy loading – CSharped

+0

Вероятно, есть, но это кажется мне самым простым способом. Есть ли требование, которое мешает вам делать это таким образом? – Tim

ответ

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, так что режим defaultcontext будет PerCall http://dotnetmentors.com/wcf/instance-management-using-instancecontextmode-property-in-wcf.aspx – Laxmikant

Смежные вопросы