2012-02-06 2 views
4

Я публикую сообщение в MT, которое имеет несколько свойств, типизированных для объекта, поскольку я не знаю тип во время компиляции. Когда я получаю сообщение у потребителя, я вижу, что свойства, типизированные для объекта, заполняются экземплярами Newtonsoft JObject-экземпляров. Класс JObject-Class находится в ILMerged Newtonsoft.Json-assembly в Masstransit.dll. Класс JObject-Class в этой сборке отмечен как внутренний. Всякий раз, когда я пытаюсь передать значение свойства в JObject, предоставленный Nuget-Assembly Newtonsoft.Json, он терпит неудачу.Сложное сообщение и де-сериализация Masstransit

Так что мои вопросы:

  • Что такое правильный способ бросить свойство-значение JObject?
  • Почему бросок не работает? Это означает, каковы трудности, с которыми здесь столкнулись?
  • Могу ли я получить сырое, несертифицированное тело сообщения в моем потребителе?

спасибо.

ответ

5

Вы не можете использовать сериализацию JSON, если вы выполняете написание во время выполнения любых контрактов с сообщениями. Если вы хотите это сделать, вам потребуется использовать двоичный сериализатор.

Вы не можете получить доступ к необработанному, несертифицированному сообщению-телу; если сообщение не может быть десериализовано, то код пользователя не вызывается.

Если любые типы, отмеченные как внутренние, не позволяют десериализовать сообщение. Конструктор не может быть вызван, поэтому не создается объект. Я не уверен, что бинарный сериализатор позволит вам обойти это ограничение, а не то, что я тестировал.

Если у вас есть другие вопросы, вы также можете присоединиться к списку рассылки, https://groups.google.com/forum/#!forum/masstransit-discuss.

+0

Благодарим за предложение. Но, к сожалению, даже сообщения типа, связанные с последним пакетом Masstransit-NuGet (heartbeat, подписка и т. Д.), Похоже, не работают с BinarySerializer. Они не украшены атрибутом Serializable. –

+2

Пожалуйста, отправьте вопрос (или, еще лучше, запрос на тяну), чтобы получить их должным образом, чтобы работать с двоичной сериализацией. –

+0

Роджер это! В какую ветвь? –

0

Моя описанная выше проблема, вероятно, возникла из-за неправильного представления моей системы обмена сообщениями. Но я обнаружил неприятную обходной путь для преобразования вложенных JObjects в нужных объектов предметной области:

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

Как один из создателей MassTransit, если вы в том числе

public object MyMessageProperty { get; set; } 

В контракте сообщение, вы «делаю это неправильно. Используйте сильно типизированные функции публикации структуры, вместо того, чтобы выполнять собственную динамическую отправку поверх диспетчеризации, уже выполняемой системой публикации/подписки внутри MT.

+0

Как вы видите, я упомянул в своем решении, которое я знаю, это не так, как вы планировали использовать полиморфную отправку. Тем не менее, у меня есть сообщения с комбинациями типов. Было бы довольно много сообщений представлять все комбинации в типизированном виде. –

+1

Да, сообщений довольно много, но наследование и интерфейсы поддерживаются, поэтому вы можете делать более интересные вещи, используя типы.Вы можете начать наблюдать за событиями, просматривать части сообщения без необходимости (x равно Y) всюду. Это действительно лучший способ сделать это, быть явным и преднамеренным против хаоса. Это важно, когда код покидает ваш разум и начинает использоваться другими. –