2009-10-16 2 views
2

만 알면 ChannelFactory를 종료하는 방법이 필요합니다.이 문제를 해결할 수 있도록 도와주세요.클라이언트가 인터페이스

WCF를 사용하는 클라이언트가 있습니다. 나는이 클라이언트가 서비스로부터 데이터를 얻는다는 것을 알리고 싶지 않다. 이렇게 모델을 사용하여 코드를 단위 테스트하고 나중에 주어진 인터페이스의 구현을 대체하는 것이 더 쉽습니다. 이 모델의 문제점은 ChannelFactory에서 close를 호출 할 수 없다는 것입니다. 나는 가까이에 전화해야한다고 확신하지 않지만, 그것이 옳다고 느낀다.

그래서 제 질문은 :

누구 클라이언트는 서비스의 인터페이스를 알아야 ChannelFactory에 폐쇄를위한 좋은 패턴을 알고 있나요? 아니면 ChannelFactory가 어떤 종류의 마술에 의해 스스로 폐쇄 되었습니까?

static void Main(string[] args) 
    { 
     ITestService service = GetTestService(); 
     Console.WriteLine(service.GetData(42)); 

    } 

    private static ITestService GetTestService() 
    { 
     var cf = new ChannelFactory<ITestService>(new WSHttpBinding(), new EndpointAddress("http://localhost:8731/TestService/")); 
     return cf.CreateChannel(); 
    } 

감사합니다, GAT

답변

4

이 문제를 해결하는 가장 좋은 방법은 등의 ChannelFactory 생존에 대한 참조를 유지하는 것입니다 : 아래

내가 희망을 일부 샘플 코드는 당신이 질문을 이해 것입니다 당신이 필요로하는 한 오래. 따라서 GetTestService 메소드에서 ChannelFactory 메소드를 생성하고 클래스의 초기화시 (예 : 생성자에서) 팩토리를 생성하고 더 이상 팩토리가 필요하지 않은 경우 (예 : 클래스의 Dispose 메소드에서) 팩토리를 닫으십시오.

ChannelFactory은 원하는만큼 여러 번 재사용 할 수있는 팩토리 클래스이므로 서비스 구현이 필요할 때마다 만들 필요가 없습니다.

+0

이것은 훌륭한 솔루션처럼 들립니다. 내가 할 수있는 일은 정적 인 ChannelFactory 가 포함 된 자체 "ServiceFactory"를 가지는 것입니다. 채널이 필요할 때마다이 멤버에서 CreateChannel()을 호출합니다. 그리고 응용 프로그램이 종료되면 나는 ChannelFactory를 닫습니다. 올바른 방법으로 들리니? – GAT

+0

올바른 방법입니다. 요점은 채널이 필요할 때마다 새로운 ChannelFactory를 생성해서는 안된다는 것입니다. ChannelFactory를 프로그램 기간 동안 유지하는 데는 아무런 문제가 없습니다. –

2

당신은 채널 공장의 수명과 동일합니다 여기

public class MyClient : ITestService 
{ 
private ChannelFactory<ITestService> factory; 
private ITestService proxy; 
//... 
//expose here methods Open and Close that internally will open and close channel factory 
//implement interface members 
} 

같은 클라이언트의 수명을 클래스를 구현해야합니다.

+0

이것은 또한 좋은 해결책 인 것 같습니다. 그래서 제가하고 싶은 것은 내 응용 프로그램에서 사용할 수있는 서비스에 대한 래퍼를 만드는 것입니다. – GAT

+0

나는 그가 처음 대답 한 이래로 @rwwilden의 대답을 수락했다. 나는 두 가지 대답이 모두 아주 좋은 곳이라고 생각합니다. 그래서 나는 당신의 대답을 썼습니다. – GAT

1

IClientChannel에 캐스팅을 시도한 다음 닫기를 호출 했습니까?

((IClientChannel)service).Close(); 
+0

그게 효과가있을 것 같아요. 그러나 나는 내 고객이 IClientChannel을 알기를 원하지 않습니다. FakeService가 IClientChannel을 구현하지 않기 때문에 이것은 나의 단위 테스트를 파괴 할 것입니다. – GAT

+0

Yeap- 개인적으로 나는 rwwilden의 해결책을 가지고 갈 것입니다. 나는 그것을 추가하려고했으나 인터넷 연결이 열차에 떨어졌습니다! – RichardOD

+0

대신 C#을 연산자로 사용하고 null이 아닌 경우 Close 만 호출한다고 생각해보십시오. 단위 테스트가 실패하지 않게하려면 여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx – RichardOD

관련 문제