2012-10-21 3 views
1

WCF 프로젝트에서 클라이언트 프록시를 얻기 위해 singleton pattern을 사용하고 있습니다.Singleton에 IDisposable을 구현하는 것이 맞습니까

는 기본적으로 최소한의 변경을 요구, Binding 또는 Endpoint를 추가 클라이언트 객체에, 나중에 필요

  1. 모든 향상된 기능을 because-.
  2. 동시에 여러 서비스를 호출하지 않습니다. 이 싱글 Design-Pattern 원칙을 위반 하는가

    public class ClientSingleton : IDisposable 
    { 
        static Service1Client client; 
        private ClientSingleton() 
        { 
         client = new Service1Client(); 
        } 
        public Service1Client getInstance() 
        { 
         if (client != null) 
          return client; 
         else 
         { 
          client = new Service1Client(); 
          return client; 
         } 
        } 
        public void Dispose() 
        { 
         client.Close(); 
        } 
    } 
    

    -

는 확인 connection is closed 제대로 각 서비스의 호출 후에, 우리는 아래와 같이 싱글에서 IDisposable을 구현하기 위해 계획하고 만들려면? 이를 개선하기위한 조언이 도움이 될 것입니다.

편집 :

아래로 클라이언트 개체를 처리하는 using block을 고려 - WCF 프록시가 IDisposable 인터페이스를 구현하는 의미

using (Service1Client client = new Service1Client()) 
{ 
    client.Operation1(); 
} 

. 그래서 여기서이 인터페이스를 구현하는데 아무런 해가되지 않습니다.

감사합니다.

+0

내가 잘못 될 수 있지만, 난 당신이/새 연결을 만들 당신이 참조하려고 것 같다 연결을 닫는 대신 원래 –

+0

따라서는 IDisposable의 구현이 폐쇄 표시되지 않는 이유는 무엇입니까? –

+0

@TonyHopkinson 여기에 코드를 추가했습니다. – Abhijeet

답변

1

내 프로젝트에서 서비스 연결을 제대로 처리하는 확장 방법을 사용하고 있습니다. 이 안전하게 연결을 닫습니다 프록시 사용할 수 있습니다 (특정 프록시에 특정) 당신의 접근 방식과는 달리

public static void CloseConnection(this ICommunicationObject client) 
{ 
    if (client.State != CommunicationState.Opened) 
    { 
    return; 
    } 

    try 
    { 
    client.Close(); 
    } 
    catch (CommunicationException) 
    { 
    client.Abort(); 
    throw; 
    } 
    catch (TimeoutException) 
    { 
    client.Abort(); 
    throw; 
    } 
    catch (Exception) 
    { 
    client.Abort(); 
    throw; 
    } 
} 

을 (내가 어떤 블로그에서 확장 방법을 훔쳐서 그 블로그 링크를 잊었).

사용 예제

Service1Client client = null 

try 
{ 
    client = new Service1Client(); 
} 
finally 
{ 
    if(client != null) 
    client.CloseConnection(); 
} 
관련 문제