문제

Visual Studio에서 웹 서비스 (이 모든 WCF)에 대한 서비스 참조를 추가하면 노출 된 인터페이스의 클라이언트 측 재조정을 포함하여 생성 된 코드가 생성됩니다.

이 인터페이스가 발생하는 이유를 이해합니다. 타사 서비스를 소비하고 실제 인터페이스에 액세스 할 수 없습니다.

그러나 나는 그렇고 두 사람은 그렇습니다 ~ 아니다 투명한 프록시가 실제로 캐스트하고자하는 인터페이스를 정확하게 구현하더라도 할당 가능.

나는 반사를 사용할 수 있지만 그것은 못 생겼다. 이 가짜 유형 안전을 물리 치고 메타 데이터를 주입하여 클래스와 인터페이스를 사용할 수있는 방법이 있습니까?


내 특정 문제는 기본 클래스의 일부 파생 상품을 직접 사용하고 서비스 참조를 통해 원격으로 다른 고객을 사용하는 단일 클라이언트와 관련된 복잡한 방식으로 표준에서 출발합니다. 각 서버의 기본 클래스는 이벤트에 알리기 위해 열거를위한 컬렉션의 가입 클라이언트에 대한 참조를 유지해야하며, 프록시 사용으로 인해 문제가 유형이 다양했습니다.

이 답변 중 어느 것도 내 특정 문제를 해결하지 못하지만 모든 단일 답변은 유익하고 도움이되었습니다. 나는 내 자신의 솔루션을 발견했지만 (이중 바인딩 사용) 전체 비즈니스에 대한 이해를 근본적으로 개선하지 않았다면 결코 알아 내지 못했을 것입니다.

세 가지 훌륭한 답변. 하나만 선택하는 방법? 첫 번째를 선택합니다. 먼저 문제를 직접 해결하기 때문입니다. 생각 나는 가지고 있었다.

도움이 되었습니까?

해결책

서비스 참조를 추가 할 때 "고급"로 이동하여 "참조 된 어셈블리의 재사용 유형"이 선택되고 인터페이스 정의가 포함 된 어셈블리가 선택되어 있는지 확인하십시오. 마우스 오른쪽 버튼을 클릭하고 "구성"으로 이동하여 기존 서비스 참조 로이 작업을 수행 할 수도 있습니다.

다른 팁

클라이언트에 이미 계약 DLL이있는 경우 서비스 참조가 필요하지도 않습니다 (귀하를 위해 설정 코드를 작성하는 데 사용하지 않는 한) - 단순히 클라이언트베이스를 서브 클래스 및 채널을 노출시켜 직접 사용할 수 있습니다. (IDE가 편리하지 않음 ...) : :

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

그런 다음 다음과 같은 작업을 수행 할 수 있습니다.

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

주소, 바인딩 등을 결정하려면 구성에서 구성 설정이 여전히 필요하지만 프록시 생성보다 지저분합니다. 또한 재 구현을 선택할 수도 있습니다 IDipsoable WCF 프록시가 던질 수 있다는 사실을 다루기 위해 Dispose() (나쁘다) :

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

서비스에서 인터페이스를 반환하려면 알려진 유형 속성을 사용해야합니다.

그 도움이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top