2012-02-06 4 views
4

컴파일 타임에 형식을 알지 못하기 때문에 여러 개의 Object-Type 속성이있는 MT에 메시지를 게시합니다. 내가 보았던 소비자에게 메시지를 받으면 Object-typed 속성은 Newtonsoft JObject-instances로 채워진다. JObject 클래스는 Masstransit.dll의 ILMerged Newtonsoft.Json 어셈블리에 있습니다. 이 어셈블리의 JObject-Class는 internal로 표시됩니다. Newtonsoft.Json의 Nuget-Assembly에서 제공하는 JObject에 속성 값을 캐스팅하려고 시도 할 때마다 실패합니다.복합 메시지 및 Masstransit 직렬화 해제

그래서 제 질문은 다음과 같습니다

  • 하는 jobject에 속성 값을 캐스팅하는 올바른 방법은 무엇입니까?
  • 왜 캐스트가 실패합니까? 즉, clr이 여기에있는 어려움은 무엇입니까?
  • 소비자에게 직렬화되지 않은 원시 메시지 본문을 가져올 수 있습니까?

감사합니다.

답변

5

메시지 계약에서 런타임 타이핑을하는 경우 JSON 직렬화를 사용할 수 없습니다. 이 작업을 수행하려면 이진 serializer를 사용해야합니다.

원시의 비 직렬 메시지 본문에 액세스 할 수 없습니다. 메시지를 deserialize 할 수없는 경우 사용자 코드가 호출되지 않습니다.

내부에 표시된 모든 유형을 사용하면 메시지를 비 직렬화 할 수 없습니다. 생성자를 호출 할 수 없으므로 객체를 만들 수 없습니다. 나는 바이너리 시리얼 라이저가 당신이이 한계를 극복 할 수있게 해 줄 것이라고 확신하지 않는다.

다른 질문이 있으시면 메일 링리스트에 가입 하시려면 https://groups.google.com/forum/#!forum/masstransit-discuss으로 환영합니다.

+0

의견을 보내 주셔서 감사합니다. 하지만 유감스럽게도 최신 Masstransit-NuGet 패키지 (하트 비트, 가입 등)와 함께 번들 된 메시지 유형조차도 BinarySerializer에서 작동하지 않는 것 같습니다. 그들은 Serializable 속성으로 장식되어 있지 않습니다. –

+2

바이너리 직렬화가 제대로 이루어 지도록 적절히 장식하기 위해 문제점을 제출하십시오. –

+0

Roger that! 어느 지점에? –

0

위의 설명 된 문제는 아마도 내 메시징 시스템에 대한 오해에서 비롯된 것 같습니다. 당신이 당신의 메시지 계약에서

public object MyMessageProperty { get; set; } 

을 포함하는 경우에는, MassTransit의 제작자 중 하나로서

protected bool TryConvertJObjectToDtoOfType<T>(Object jObjectInDisguise, out T dto) 
    where T: BpnDto 
{ 
    try 
    { 
     if (jObjectInDisguise.GetType().Name != typeof(JObject).Name) 
      throw new ArgumentException("Object isn't a JObject", "jObjectInDisguise"); 

     var json = jObjectInDisguise.ToString(); 
     var settings = new JsonSerializerSettings() 
     { 
      MissingMemberHandling = MissingMemberHandling.Error 
     }; 

     dto = JsonConvert.DeserializeObject<T>(json, settings); 
     return true; 
    } catch 
    { 
     dto = null; 
     return false; 
    } 
} 
2

:하지만 올바른 도메인 객체에 중첩 된 JObjects을 변환하는 불쾌한 해결 방법을 발견 그것을 잘못하고있다. MT 내부의 publish/subscribe 시스템에 의해 이미 수행 된 디스패치 작업에 대해 직접 동적 디스패치를 ​​수행하는 대신 프레임 워크의 강력한 형식화 된 게시 기능을 활용하십시오.

+0

당신이 보았 듯이, 나는 내가 알고있는 해결책에서, 다형성 파견이 의도했던 방식이 아니라고 언급했다. 즉, 유형 조합이있는 메시지가 있습니다. 입력 된 방식으로 모든 조합을 나타내는 것은 상당 수의 메시지입니다. –

+1

네, 꽤 많은 메시지가 있지만 상속과 인터페이스가 지원되므로 유형을 활용하여보다 흥미로운 것을 할 수 있습니다.어디에서나 (x는 Y) 필요없이 이벤트를 관찰하고 메시지의 일부를 볼 수 있습니다. 그것은 실제로 그것을하는 가장 좋은 방법입니다. 명백하고 신중해야합니다. 이것은 코드가 마음을 떠나 다른 사람에 의해 사용되기 시작할 때 매우 중요합니다. –

관련 문제