2009-05-29 3 views
4

그래서 메시지를 보내려는 두 개의 개별 응용 프로그램이 있습니다. NServiceBus를 사용하고 있지만 실제로는 중요하지 않습니다. 응용 프로그램 A에서 응용 프로그램 B로 메시지를 보내고 둘 다 동일한 계약을 알고있게하려면 어떻게해야합니까?NServiceBus를 사용할 때 응용 프로그램간에 메시지 클래스를 공유하려면 어떻게합니까?

클래스 SecretMessage ...

public class SecretMessage : IMessage 
{ 
    public string Title { get; set; } 
    public string Body { get; set; } 
} 

직렬화 및 응용 프로그램 B에

이제 응용 프로그램 B에 와이어를 통해 전송 될 객체이다, 어떻게 할 그래서 응용 프로그램 A가있다 해당 유형의 메시지를 수신 한 다음 해당 메시지를 같은 클래스로 역 직렬화 할 수 있습니까? 이것이 유지 보수의 악몽이 아닌, 전송 된 데이터를 사용할 수 있습니다.

앱 B는 클래스의 복사본이 있어야하나요? 이 메시지 클래스의 공유 dll을 통해 처리해야 각 애플 리케이션에 대한 참조를 (나는 희망)? 그들은 각각의 응용 프로그램에서 동일한 속성을 가진 완전히 분리 된 DTO로 다시 만들어야합니까?

여기에 뭔가가 있습니까?

답변

6

원하는 답변이 아닐 수도 있지만 여기에는 은색 글 머리 기호가 거의 없습니다.

당신은 정말 몇 선택을 가지고, 및 다음 기능과의 수준에 따라 달라집니다 당신이 당신의 메시지 클래스에 원하는 타입 경화했습니다

  1. 공유 DLL의 - 이익이 코드가 될 수 있음 + 구조 예 유용한 생성자, 복잡한 열거 자, 디버깅 ToString 구현 등 강력한 버전 관리. 별도의 프로젝트와 DLL 배포가 필요합니다.
  2. 공유 스키마 및 코드 생성. 유형에 대한 스키마를 선언하고 코드 생성을 사용하여 클래스를 작성하십시오. 여기에 다양한 전략이 있습니다. 예를 들어 T4 Templating, Custom Code Generation, CodeSmith 또는 Proto.Bufs과 같은 도구 및 라이브러리가 있습니다. 검색을 통해 더 많은 정보를 찾을 수 있습니다. 매우 강력 할 수 있습니다. 코드 켄 (CodeGen)을 사용하여 DB에서 UI까지 신속한 프로토 타이핑을 통해 모든 프로젝트를 시작하는 많은 코드 첩을 알고 있습니다. 스키마를 배포해야합니다.
  3. 코드 DOM을 통해 형식을 생성하기에 충실한 메시지를 serialize합니다. 각 메시지는 모든 메시지 인스턴스를 나타 내기에 충분한 유형의 메타 데이터를 전달하는 데 드는 비용이 발생합니다. 예 : nullable 필드의 표현. 또한 메시지 래퍼 유형을 생성하는 데 본질적인 "발견"비용이 내재합니다.
  4. 이름/값 쌍과 같은 약한 구조로 데이터를 직렬화 한 다음 사전 형 래퍼 클래스를 생성합니다. 약한 타이핑 - 쉽게 확장 할 수 있습니다. '

정말 유일한 선택입니다. IMHO # 2, 그 순서대로 # 1이 일반적으로 가장 유용한 패턴입니다.

+0

멋진 게시물. 수업이 사는 단지 # 1과 # 2의 주된 차이점은 무엇입니까? # 1에서는 클래스가 소비 프로젝트 자체의 일부인 프로젝트간에 배포되는 DLL에 있습니다. –

+0

오른쪽 - 일반적으로 코드 생성은 프로젝트 외부에서 수행되고 결과는 가져 오기되거나 프로젝트 내에서 빌드 항목으로 발생합니다. – stephbu

관련 문제