IDisposable и WCF - PullRequest
       23

IDisposable и WCF

1 голос
/ 12 июля 2010

На работе я нашел вспомогательный класс для управления службами WCF, который реализует IDisposable и имеет ServiceAgent, производный от System.ServiceModel.ClientBase.Метод Dispose () закрывает все открытые службы WCF.Помощник предоставляет методы, которые обертывают вызовы методов ServiceAgent.Каждый метод построен на этом шаблоне:

public void WCFMethod1()
{
    using(this)
    {
        this.ServiceAgent.WCFMethod1();
    }
}

public override void Dispose()
{
    try
    {
        this.ServiceAgent.Close();
    }
    catch
    {
        this.ServiceAgent.Abort();
    }
    finally
    {
        this.ServiceAgent = null;
    }
}

Вот вопрос: является ли использование (это) хорошей практикой?

Ответы [ 2 ]

1 голос
/ 12 июля 2010

Конечно, этот код - плохая практика. Вызывающий объект решает, нужен ли экземпляр или нет. Предполагается, что после вызова метода Dispose вызовы методов больше не допускаются (согласно рекомендациям экземпляр переходит в состояние удаления). Представьте, что вы вызываете какой-то метод, затем другой и получаете исключение ObjectDisposed. Довольно странно, не правда ли?

1 голос
/ 12 июля 2010

Мне это не нравится. Я думаю, что класс должен быть а) размещен один раз б) кодом, который его создал. IDisposable обычно понимается как способ реализации шаблона RAII . MSDN прямо заявляет:

Если метод Dispose объекта вызывается более одного раза, объект должен игнорировать все звонки после первого. Объект не должен выбрасывать исключение если вызывается его метод Dispose многократно. Методы экземпляра другие чем распоряжаться могу бросить ObjectDisposedException, когда ресурсы уже утилизированы.

Таким образом, пользователи сочтут это поведение непонятным, поэтому я рекомендую разработать класс так, чтобы он создавался для каждого вызова:

using (var clientFactory = new ClientFactory())
   clientFactory.Client.WCFMethod1();
...