Сложное сообщение и десериализация Masstransit - PullRequest
4 голосов
/ 06 февраля 2012

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

Итак, мои вопросы:

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

Спасибо.

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

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

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

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

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

2 голосов
/ 07 февраля 2012

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

public object MyMessageProperty { get; set; }

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

0 голосов
/ 07 февраля 2012

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

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;
    }
}
...