2014-03-19 11 views
1

내 클라이언트 프로젝트에서 호출 할 서비스가 있어야합니다. 요구 사항은 서비스를 변경하고 릴리스 할 수 있지만 서비스를 변경 한 후에는 클라이언트를 다시 빌드 할 필요가 없어야한다는 것입니다. 예, 나는이 경우 내가 클라이언트에서 ReachedByTrain 서비스를 호출됩니다의 사람이 지금은 서비스가 기차로 목적지에 도달하기 위해 사람을 돕고 대상Extensible WCF 서비스를 만드는 방법

[ServiceContract] 
IDestinationHelper 
{ 
    [OperationContract] 
    void ReachDestination(string person); 
} 

class ReachedByTrain:IDetinationHelper 
{ 
    void ReachDestination(string person) 
    { 
    //Help the person to reach destination 
    } 
} 

에 도달하는 데 도움이 서비스를 가정되지만, 요구 사항이오고 그 사람이 Flight로 연락하기를 원합니다.이 경우, 클라이언트를 변경하거나 구축하지 않고 어떻게 진행해야합니까? 기능은 연결 가능해야하며 클라이언트가 자동으로 감지해야합니다.

class ReachedByFlight:IDetinationHelper 
    { 
     void ReachDestination(string person) 
     { 
     //Help the person to reach destination 
     } 
    } 

어떻게 수행 할 수 있는지에 대한 도움말이나 참조를 제공해주십시오.

P.S 한 번에 하나의 모드 만 클라이언트에 제공됩니다. 클라이언트가 그것에 대해 알지 못하더라도 상관 없습니다.

답변

1

확장성에 도달하는 데는 여러 가지 방법이 있습니다.

인터페이스가 클라이언트에서 수정되었습니다. 변화하는 인터페이스를 처리하는 코드를 작성하는 것은 어렵고 오류가 발생하기 쉽습니다. 그러지 마.

따라서 인터페이스를 그대로 유지하고 클래스의 내부 동작을 변경해야합니다.

예를 들어, 서비스는 대상에 대한 경로 및 운송 모드를 나타내는 문자열로 점 목록을 반환 할 수 있습니다. 이제 인터페이스를 변경하지 않고 모든 종류의 운송 모드와 경로를 포함 할 수 있습니다.

새 전송 모드를 추가 할 때 ComboBox와 같이 사용자에게 제공 될 수 있도록 클라이언트에 알림을 보내야합니다. 즉, 모든 가능한 운송 모드를 반환하는 인터페이스의 메소드가 필요합니다. 그렇게하면 클라이언트가 다시 컴파일하지 않고 새로운 클라이언트를 처리 할 수 ​​있습니다. 모드를 제거 할 때도 처리 할 수 ​​있습니다.

이렇게하면 고객이 계약을 맺고 계약이 변경되지 않습니다. 그러나 서비스를 다시 빌드하고 다시 배포 할 때 메서드가 다른 것을 반환 할 수 있습니다.

예 :

이 계약은 결코 변하지 않는다 :

[ServiceContract] 
IDestinationHelper 
{ 
    [OperationContract] 
    IEnumerable<Waypoint> ReachDestination(string transportationMode); 

    [OperationContract] 
    IEnumerable<string> GetAvailabletransportationModes(); 
} 

IDestinationHelperService : IDestinationHelper 
{ 
    public IEnumerable<Waypoint> ReachDestination(string transportationMode) 
    { 
    // decide return value by transportation mode. Use a switch statement, dependency injection, IoC containers, whatever you want 
    } 

    public IEnumerable<string> GetAvailabletransportationModes() 
    { 
    // decide return value by getting all modes from wherever you decided upon above. 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 사람이 목적지에 도달하고 있음을 고객이 알 필요가 없습니다. 도달하기 위해서는 적절한 서비스 (교통 수단)를 호출해야하며 한 번에 하나의 모드 만 존재하게됩니다. 이것이 어떻게 기술적으로 달성 될 수 있는지. – Vikram

+0

인터페이스를 변경하지 않는 한 원하는만큼의 서비스 (열차 용, 비행기 용)로 호스트 할 수 있으며 예를 들어 URL을 다르게 할 수 있습니다. 또는 가지고있는 파일을 덮어 쓸 수 있습니다. 기차가 아닌 비행기로 모든 고객을 이동 시키려면 서비스를 재구성하고 다시 배포해야합니다. 중요한 것은 인터페이스를 변경하지 않는 것입니다. – nvoigt

+0

다른 서비스를 가지고 있지만 인터페이스는 동일하지만, 클라이언트 변경이 필요할 것으로 생각되는 서비스를 변경할 때마다 끝점을 변경해야합니다. 미안하지만 WCF를 처음 사용합니다. – Vikram

0

나는 당신이 필요가 있다고 생각을 가진 [의 ServiceContract]은 [OperationContract를] 매개 변수로 "ModeOfTransport"를 타고 라우팅을 가지고 것이다 논리를 사용하여 ReachByTrain 또는 ReachByPlane 또는 ReachByAnything의 개체를 만들고 [OperationContract] 내에서 호출합니다. 클라이언트 측에서 적절한 매개 변수를 가진 라우팅 논리를 가진 [OperationContract]를 호출 할 수 있습니다.