2010-04-26 8 views
4

여러 wcf 서비스가 동일한 서비스 계약 인터페이스를 구현할 수 있습니까?동일한 서비스 계약 인터페이스를 구현하는 여러 WCF 서비스

내가 원하는 것은 테스트 서비스가 실제 서비스에 대해 상호 교환 가능하고 구성 파일에서 사용될 서비스를 지정할 수있게하려는 것입니다. 예를 들어

:

[ServiceContract] 
public interface IUselessService 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

테스트 구현

public class TestService : IUselessService 
{ 
    public string GetData(int value) 
    { 
    return "This is a test"; 
    } 
} 

리얼 클래스

public class RealService : IUselessService 
{ 
    public string GetData(int value) 
    { 
    return string.Format("You entered: {0}", value); 
    } 
} 
+0

는, 에디터에서 그 라인을 강조 표시 한 다음 잘에 편집기 도구 모음에서 "코드"버튼 (101 010)를 클릭하십시오 : 여기

구성 파일의 조각입니다 형식 및 구문 강조 표시. 차이를 만드는 세상을 만듭니다! 감사합니다 –

답변

4

답변 해 주셔서 감사합니다. 이제는 별도의 어셈블리와 GAC에 인터페이스를 넣지 않고도 저에게 맞는 솔루션이 있습니다. 나는 같은 프로젝트의 여러 서비스에 동일한 인터페이스를 사용하여 다른 프로젝트에 대한 인터페이스를 사용하지 않을 것입니다.

내가하려고 한 것은 WCF 서비스의 구성 파일에서 RealService와 TestService 사이를 변경하여 클라이언트가 그 차이를 알 수 없도록하기위한 것입니다 (클라이언트가 다른 점을 가리 키도록 구성을 변경할 필요가 없음). .svc 파일). 나는 이것이 가능한지, 또는 그것이 적어도 있다면 그것은 분명히 직선이 아님을 확신하지 못한다.

지금 내가하고있는 일은 WCF 서비스의 구성 파일에서 두 서비스를 지정하는 것입니다. 그런 다음 원하는 서비스를 기반으로 클라이언트를 하나 또는 다른 서비스로 지정합니다. 이 WCF 서비스는 내부 용이므로 클라이언트와 서비스를 모두 제어 할 수 있으므로 나쁜 절충안은 아닙니다. 이 솔루션은 어쨌든 의도적으로 더 명확하게 표현됩니다. 당신이 코드를 게시 할 경우

<services> 
     <service behaviorConfiguration="WcfService1.Service1Behavior" 
       name="WcfService1.TestService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding" 
      contract="WcfService1.IUselessService">    
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
     <service behaviorConfiguration="WcfService1.Service1Behavior" 
       name="WcfService1.RealService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding" 
     contract="WcfService1.IUselessService">    
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
4

네, 그것은 서비스 계약 인터페이스의 설계 의도 내에서 명시 적으로뿐만 아니라 가능합니다입니다 .

+0

나는이 일을 시도했지만 구성 오류가 발생합니다. 나는 아마 잘못하고있다. 각 서비스 클래스는 .svc 및 .svc.cs 파일에 있습니다. 그럼 내가 원하는 서비스 이름 지정은 BasicHttpBinding "bindingConfiguration는 ="testBasicHttpBinding " 계약"= 바인딩 = "" <서비스 behaviorConfiguration = "WcfService1.Service1Behavior" 이름 = "WcfService1.RealService"> <엔드 포인트 주소를 = "WcfService1.IUselessService "> 그런 다음 서비스 XML 요소의 이름 속성을 변경하고 원래 서비스에 종점이없는 런타임 오류가 발생합니다. –

+0

구성에서 인터페이스 이름을 참조하려고합니다. 실제 서비스보다 두 가지 (모든) 구현이 동일한 인터페이스를 사용하는지 확인하십시오. –

+2

동일한 인터페이스를 사용하려면 인터페이스가 동일한 시그니처 (동일한 매개 변수)를 가져야하며 .NET에서 동일해야합니다. 이렇게하려면 인터페이스의 정의를 강력한 서명 된 어셈블리에 배치하고 GACUtil -i MyInterface.dll을 사용하여 GAC에 배치해야합니다. 그런 다음 두 프로젝트 모두에서이 어셈블리를 참조해야합니다. – Oleg

2

IUselessService 인터페이스를 별도의 어셈블리 안에 정의하고이를 GAC에 넣으면. 이 어셈블리는 IUselessService 인터페이스와 IUselessService의 매개 변수로 요구 사항을 사용하는 일부 다른 유형을 정의하는 것만 구현하면 안됩니다.

TestService와 RealService는 모두 동일한 IUselessService 인터페이스를 구현해야합니다. 각 서비스에 대해 두 개의 추가 프로젝트를 만들어야한다는 것을 의미합니다. 그러면 TestService와 RealService에는 유형 충돌이 없습니다.

관련 문제