2011-01-25 2 views
2

"평범한"중재자 디자인 패턴 (일부 설명은 위키 백과 : http://en.wikipedia.org/wiki/Mediator_pattern)을 알고 있습니다. 내 SOA에는 알림 서비스가 있습니다. 특정 서비스에서 구독하는 다른 모든 서비스로 메시지를 브로드 캐스트해야합니다. 사실, 어떤 서비스도 그러한 메시징의 원천이 될 수 있습니다.SOA의 중재자로서의 서비스

이러한 서비스 구현에 대한 필자의 시각은 서비스 간 순환 의존성을 초래합니다. 여기 (Circular dependency in SOA) 나는 그것을 해결하는 방법을 물어 왔고이 목적을 위해 '중재자'패턴을 사용하라는 조언을 받았다.

만약 내가 제대로 이해하고, 내 알림 서비스는 계약이 있어야합니다

interface IMediator 
{ 
    void PublishMessage(IMessage message); 
} 

서비스를 구현해야합니다 (호스트)이 인터페이스를 외부 서비스로 노출됩니다.

상관 가입자해야 :

  1. (호스트) 자신 측의 동일한 인터페이스를 구현;
  2. 알림 서비스쪽에 등록해야합니다.
  3. 사실

가입자는 예를 들어, 다른 의미로 인터페이스를 사용할 수 있습니다 : 나는 다음과 같은 통신 흐름을 볼 수이 경우

interface IReceiver 
{ 
    void ProcessMessage(IMessage message); 
} 

:

  1. 모든 서비스가 IMediator.PublishMessage를 호출을 (메시지) 통지 서비스;
  2. 알림 서비스는 구독자 목록을 살펴보고 각 구독자에 대한 IReceiver.ProcessMessage (메시지)를 호출합니다.

질문 1 :과 같은 디자인으로 모든 것이 괜찮습니까?

질문 2 : IMessage의 유형은 무엇입니까?

interface IMessage 
{ 
    string MessageType{get;} 
    string MessageContent{get;} 
} 

을하지만, 여기에 내가이 문제를 참조하십시오 : 나는 생각하지 않습니다

  1. 나는 간단한 문자열을 전달해야하는 지금은

    때문에 가능한 구현 중 하나는 다음을 수 MessageType을 문자열로 전달하는 것은 좋은 생각입니다. 내가 문자열로 메시지의 모든 유형을 인코딩하고 싶지 않다

  2. ....

알려 주시기 바랍니다. 어떤 생각이라도 환영합니다!

P. WCF 서비스를 서비스의 기본 엔진으로 사용할 계획입니다.

편집 : 몇 가지 생각 후에 내가 볼 것을 :

  1. IMediator에 별도의 방법은 각 메시지 유형에 따라 필요합니다;
  2. 각 메시지 유형마다 별도의 수신자 인터페이스가 필요합니다. 한쪽에서

은 - ...

큰 오버 헤드 - 서로, 합리적인 것 같다?

답변

2

위에서 언급 한 것을 다시 한 번 생각해 보면 중재자 패턴의 핵심 아이디어는 객체 간의 결합을 제거하는 것입니다. 이 이유 중 하나는 전체 프로그램 주위로 확산하는 대신 클래스로 제한함으로써 객체와 상호 작용하는 복잡성을 캡슐화하는 것입니다. IMHO 클래스는 위임을위한 클래스입니다. http://en.wikipedia.org/wiki/Event-driven_SOA이 문서는 또한 메시지의 데이터 구조의 문제를 해결 : http://en.wikipedia.org/wiki/Observer_pattern

이 잘 여기에 설명되어 있습니다 - 당신이 여기에 대해 이야기

게시 '구독 문제는 더 옵저버 패턴의 영역이다.

+0

감사합니다. – Budda

+0

예, 몇 가지 생각을 한 후에 SOA에 대한 '옵서버 (Observer)'적응을 시작하겠습니다. – Budda

관련 문제