2010-07-12 4 views
1

직장에서 IDisposable을 구현하고 System.ServiceModel.ClientBase에서 파생 된 ServiceAgent가있는 WCF Services를 관리하는 도우미 클래스를 찾았습니다. Dispose() 메서드는 열려있는 모든 WCF 서비스를 닫습니다. 헬퍼는 ServiceAgent의 메소드에 호출을 래핑하는 메소드를 노출합니다. 각 방법은 그 패턴을 기반으로합니다 :IDisposable 및 WCF

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

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

여기에 질문이 있습니다. (이) 좋은 연습을 사용하는 것입니까?

+0

WCF의 버그/코드에 대한 해결 방법입니다. http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx – Rohit

+0

아니요 해결 방법이 없습니다. * Dispose() *는 "* WCFMethod *"클래스를 정리하고 서비스를 닫지 않아야합니다. 안드레이 (Andrey)와 파벨 (Pavel)은 이런 방식이 혼란 스럽다고 말합니다. "* Dispose() *"가 호출되면이 객체를 더 이상 사용하지 않을 것입니다. 폐기 될 예정이므로 정의에 따라 GC에 의해 언제든지 정리할 수 있습니다. –

답변

1

나는 그것을 좋아하지 않는다. 나는 클래스가 a) 한번 인스턴스화 된 코드에 의해 처리되어야한다고 생각한다. IDisposable은 일반적으로 RAII 패턴을 구현하는 방법으로 이해됩니다. MSDN 명시 적으로 상태 : 객체의 폐기 방법은 두 번 이상 객체가 첫 번째 후 모든 통화를 무시해야한다 더이라고 입니다

합니다. 해당 개체의 Dispose 메서드가 번으로 여러 번 호출되면 개체에서 예외 을 throw하면 안됩니다. 인스턴스 메서드가 다른 Dispose보다 이 이미 삭제 된 경우 ObjectDisposedException을 throw 할 수 있습니다.

그래서 사용자는 혼란이 동작을 발견 할 것이다, 그래서 난이 호출 당 인스턴스화 될 수 있도록 클래스를 설계하는 것이 좋습니다 : 확인을 위해

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

이 코드는 나쁜 방법입니다. 인스턴스가 필요한지 여부를 결정하는 것은 호출자입니다. Dispose 메서드가 호출 된 후 메서드 호출이 더 이상 허용되지 않는다고 가정합니다 (지침에 따라 인스턴스가 배치 된 상태로 전환됨). 어떤 메서드를 호출 한 다음 다른 메서드를 호출하고 ObjectDisposed 예외를 얻는다 고 상상해보십시오. 이상한 것 같지 않아?