2012-01-20 2 views
4

여러 WCF 서비스 참조가있는 웹 응용 프로그램을 개발 중입니다. 현재, 때마다 우리는 (예를 들어) 우리는 다음을 수행하는 서비스를 호출 할 필요가 :정적 클래스의 객체 인스턴스

Service.ServiceClient ServiceClient = new Service.ServiceClient(); 
ServiceClient.SomeMethod(); 

는 각 서비스에 정적 참조가 정적 클래스가 대신 그 클래스를 호출하는 것이 더 있을까 따라서 우리는 호출 할 때마다 ServiceClient 객체의 새로운 인스턴스를 생성하지 않아도됩니까?

예를 들어

:

public static class Services 
{ 
    private static Service.ServiceClient _ServiceClient = new Service.ServiceClient(); 
    public Service.ServiceClient ServiceClient 
    { 
     get 
     { 
      return _ServiceClient; 
     } 
    } 
} 

그리고 각각의 시간을 만들 수 라인을,이 방법

private static Service.ServiceClient _ServiceClient = new Service.ServiceClient(); 

원인 새 개체를 그것을 할 일을하는 경우, 우리는 그 개체를 호출하려고, 또는 것 우리가 호출 할 때마다 그 객체의 동일한 인스턴스가 될까요?

당신은 같은 도우미를 사용할 수
+1

처럼 소모됩니다 이제 다음과 같이이 함수 내에서 당신이 할 수있는 모든 채널 공장 아래에 다른 인스턴스 먹으 렴 사이의 자원을 공유하는 방법 모든 인스턴스간에 공유 리소스를 확보하기 위해 각 인스턴스를 완료 한 후에 각 인스턴스를 Close()해야하는 이유는 무엇입니까? –

+1

플러스, 모든 호출에 대해 동일한 프록시 객체를 사용하고 어떤 이유로 든 호출에 실패한 경우이 객체는 중단하고 긴 스토리를 사용하지 않으면 사용할 수 없습니다. 그것은 그런 식으로 사용하도록 설계되었으며, 프록시의 인스턴스를 만들고, 메소드를 호출하고, 마지막으로 인스턴스를 Close()합니다. –

답변

2

당신은 당신의 데이터 계약에 의해 노출 된 모든 기능을하는 클래스를 가질 수 있습니다. 이 모든 방법은 정적입니다.

public class ServiceManager{ 
    public static CalculatedData SomeMethod() 
    { 
     var client = GetClient(); 
     try 
     { 
      return client.SomeMethod(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Error 
     } 
     finally 
     { 
      if(client.State == System.ServiceModel.CommunicationState.Opened) 
       client.Close(); 
     } 

    } 
    private static SomeClient GetClient() 
    { 
     return new ServiceClient(); 
    } 
} 

은 소비자 그것은 각각의 호출로 새로운 인스턴스를 생성합니다

var calculatedData = ServiceManager.SomeMethod(); 
0

다음

Helper.PerformServiceAction(client => client.SomeMethod()); 

그것은 여전히 ​​호출 만에 모든 호출 또는 시퀀스에 대한 프록시를 작성 후 다음과 같은 방법을 호출 할 수 있습니다

private delegate void ServiceAction(Service.ServiceClient client); 

private static void PerformServiceAction(ServiceAction serviceAction) 
{ 
    using (var client = new Service.ServiceClient()) 
    { 
    serviceAction(client); 
    } 
} 

귀하의 전화 코드는 가볍습니다.

(wcf 클라이언트 프록시에서 'using'을 사용하는 것은 좋은 생각이 아닙니다. dispose가 예외를 던질 수 있으므로 예외를 catch하고 수동으로 정상적으로 프록시를 닫는 것이 낫습니다.)

+0

네,하지만 클라이언트는 어떤 예외가 발생하면 처리를 중단해야합니다. 그렇지 않아야합니까? –

+0

@ArsenMkrt 예. 그러나 using을 사용하면 원래 예외로 숨기는 예외가 트리거 될 수 있습니다. –

1

한 번만 생성되며 작성시기는 제어 할 수 없습니다. 이를 처리하는 일반적인 방법은 인스턴스를 만들거나 처음 호출 할 때 인스턴스를 만드는 별도의 정적 메서드 (예 : init)를 만드는 것입니다. 이 경우 singleton design pattern을 확인해야합니다. 당신이 원하는 경우

+0

Mhmm 나는 이것을 생각했지만 그렇게 좋은 해결책은 아니다. 또한 정적 {} 생성자를 사용하는 것이 많은 도움이 될 것이라고 생각하지 않습니다. –

2

그래서 싱글 톤 서비스는 궁극적 공유 할 수있는 서비스입니다

Singleton Service

만듭니다. 서비스가 싱글 톤 (singleton)으로 구성된 경우 모든 클라이언트는 연결되는 서비스의 종단점에 관계없이 동일한 하나의 잘 알려진 인스턴스에 독립적으로 연결됩니다. 싱글 톤 서비스는 영원히 존재하며 일단 호스트가 종료되면 처분됩니다. 싱글 톤은 호스트가 생성 될 때 정확히 한 번만 생성됩니다.

당신은 InstanceContextMode.Single에 InstanceContextMode 속성을 설정하여 싱글 서비스를 구성 :

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class MySingleton : ... 
{...} 
+0

이것이 OP가 달성하려고하는 것이 아니라고 생각합니다. –