2014-02-17 6 views
1

한 곳에서 다른 wcf 라이브러리의 서비스를 호스팅하려면 어떻게해야합니까?WCF 하나의 ServiceHost 많은 WCF 라이브러리

나는이

.DLLA

Public Class clientA : InterfaceA 

.DLLB 같이, 2 개 WCF liberary의 DLL을 세웠

Public class clientB : InterfaceB 

두 인터페이스 서비스 계약 속성과 자신의 운영 계약 (들이). 두 DLL을 공유 폴더에 배치하여 동적으로로드하고 서비스로 호스트 할 수 있습니다.

이제는 중간 계층으로 "AutoHosting"콘솔 응용 프로그램을 만들고 하나의 단일 ServiceHost를 사용하여이 두 가지 동일한 UriListen으로 할당해야합니다.

추신 : 나는 가능한 한 유연한 솔루션을 원합니다. 예를 들어 앞으로 DLLC를 추가 할 예정입니다. ServiceHost가 "AutoHosting"부분을 수정하지 않고 자동으로 DLLC 서비스를 선택할 수 있기를 바랍니다.

내가 가진 최선의 방법을 알려주십시오.

+0

이렇게하려면 두 사람 중 한 사람이 "추가 작업"을해야합니다. DLL 작성자는 app.config (하드 코딩 된 값 또는 대체 구성 파일 위치)에 구성 설정없이 서비스를 실행할 수 있도록 DLL을 작성해야하거나 DLL 사용자가 자신의 구성 파일을 수정해야합니다. DLL의 게시 된 끝점 설정 어느 것을하고 싶은가요, 각각에 대한 해결책은 약간 다릅니다. –

+0

또한 DLLA와 DLLB가 DLL이 내부에서 사용할 수있는 클래스와 인터페이스의 이름 같은 정보를 반환 할 수있는 클래스에서 구현해야하는 마스터 "플러그인 인터페이스"를 정의 할 수있는 단일 프로젝트를 참조 할 수 있습니다 DLL. –

+0

Scott, 답변 해 주셔서 감사합니다. 50 + dll이 필요하기 때문에 추가 작업이 필요하다면 우리는 그렇게 할 것이므로 괜찮습니다. 웹에서 찾은 유일한 해결책은 부분 클래스를 사용하는 것입니다. 그러나 일부 서비스 나 인터페이스를 추가 할 때마다 내 DLL을 다시 컴파일해야하기 때문에 사용하지 않으려합니다. – John

답변

0

질문에 대한 귀하의 의견을 토대로 마침내 주요 문제를 이해할 수 있다고 생각합니다.

스콧, 예,이 방법을 생각했지만 클라이언트 dll이 50 이상을 넘을 때 example.org/MyServices/Client01 ... example.org/MyServices/Client50이 노출 될 것입니다. 그때 당신은 app.config가 끔찍한 것입니다. 하나의 클라이언트가 모든것을 소비하고 싶다면

모든 것이 한 번에 대화 할 수있는 원한다면 (그리고 나는 좋은 생각이라고 말하는 것이 아닙니다. 거대한 클라이언트 app.config 파일을 가지고 갈 것입니다.) 서비스 엔드 포인트로 작동 할 클래스를 동적으로 생성하고 정의 된 모든 인터페이스를 구현하고 DLL 호출을 프록 싱해야합니다.

그래서 이론적으로 마스터 클래스를 추가하거나 DLL을 제거하고 일을 때마다 프로그램을 다시 컴파일 할 필요 요구 사항에 대해 이제

[ServiceContract] 
public interface IMasterInterface : InterfaceA, InterfaceB 
{ 
} 

public class MasterClass : IMasterInterface 
{ 
    public MasterClass() 
    { 
     aInstance = new DllA.clientA(); 
     bInstance = new DllB.clientB(); 
    } 

    DllA.InterfaceA aInstance; //Use full namespaces to prevent conflicts. 
    DllB.InterfaceB bInstance; 

    public void DllA.InterfaceA.Foo() //Use explicit interfaces to prevent name conflicts 
    { 
     aInstance.Foo(); 
    } 

    public bool DllB.InterfaceB.Foo() 
    { 
     return bInstance.Foo(); 
    } 
} 

같이 보일 것입니다, 당신은 아직도 할 것 그 이지만 개발 시간에는이 아닙니다.

.NET은 런타임시 어셈블리를 CodeDOM과 함께 생성 할 수있는 클래스를 제공합니다. 프로그램이 시작될 때마다 (또는 최소한 DLL 변경을 감지 할 때마다) MasterClassIMasterInterface 클래스를 다시 만들어야합니다. DLL을 열거하고 단일 마스터 클래스와 인터페이스를 구축하십시오.

중요 참고 : 새 DLL을 추가하거나 제거하여 다시 빌드 할 때 클라이언트와의 계약이 중단되는지는 잘 모릅니다. 또한 이름 충돌이 클라이언트 측에서 어떻게 보이는지 전혀 알지 못합니다. 나는 아직도 당신을 추천한다 do not는이 접근법을하고, 단지 다수의 종점을 가리키는 큰 app.config를 가지고있다.Visual Studio와 함께 제공되는 SvcConfigEditor.exe 같은 도구를 사용하여 app.config을 생성하면 유사한 여러 서비스 간의 구성 섹션을 다시 사용하여 훨씬 더 작게 만들 수 있습니다.

관련 문제