Общественный транспорт.Использовать одинаковые объекты, определенные в разных пространствах имен - PullRequest
0 голосов
/ 24 сентября 2018

Прежде всего, извините за мой английский, это очень плохо.Я использую MassTransit с Azure Service Bus для асинхронной связи между микросервисами.По их собственному определению и во избежание генерации зависимостей между ними сообщения, отправляемые между различными микросервисами, определяются в каждом из них, то есть являются частью разных пространств имен.Автоматическое управление MassTransit приводит к тому, что очереди и разделы управляются типом объекта, что предотвращает получение сообщениями, отправленными издателем микросервиса, микросервисам, использующим сообщение.То же самое происходит с двумя классами с одинаковыми свойствами в одном пространстве имен, но с другим именем класса.

Есть ли способ решить эту проблему?У меня возникли следующие варианты:

  • Удалить пространство имен из конечной точки адреса назначения, указав в нем только имя класса.
  • То, что MassTransit может управлятьсоздание очередей и тем на основе сериализации объекта, а не управления им на основе типа объекта (возможно, с помощью какого-либо объекта обтекания?)

Я оставляю пример, который, я надеюсь, может помочьВы в понимании проблемы.

//FIRST PROGRAM - MESSAGE CONSUMER 

namespace Consumer
{
    public class Example
    {
        public string PropOne { get; set; }

        public string PropTwo { get; set; }
    }

    public class ExampleConsumer : 
        IConsumer<Example>
    {
        public List<Example> ConsumedTestObjectList { get; } = new List<Example>();

        //THIS METHOD NEVER CALL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        public Task Consume(ConsumeContext<ExampleConsumer> context)
        {
            ConsumedTestObjectList.Add(context.Message);
            return Task.CompletedTask;
        }
    }

    public class ConsumerProgram
    {
        public static void Main()
        {
            var bus = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
            {
                var host = sbc.Host("connectionString", h => {});

            });

            sbc.ReceiveEndpoint(host, e =>
            {
                e.Consumer<ConsumerProgram.Example>(context =>
                {
                    return Console.Out.WriteLineAsync($"Message Received: {JsonConvert.SerializeObject(context.Message)}");
                });
            });

            bus.Start(); // This is important!

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            bus.Stop();
        }
    }
}


//SECOND PROGRAM - MESSAGE PUBLISHER 

namespace Publisher
{
    public class Example
    {
        public string PropOne { get; set; }

        public string PropTwo { get; set; }
    }

    public class PublisherProgram
    {
        public static void Main()
        {
            var bus = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
            {
                var host = sbc.Host("connectionString", h => {});

            });

            bus.Start(); // This is important!

            //send new instance of Publisher.Example 
            var example = new Example() { PropOne = "1", PropTwo = "2" };
            bus.Publish(example);

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            bus.Stop();
        }
    }
}

Большое спасибо.

С уважением

Борха

1 Ответ

0 голосов
/ 24 сентября 2018

Тип сообщения и получающееся имя являются ключевым понятием в MassTransit.Если вы хотите избежать совместного использования сборок между проектами, это нормально, но вам нужно будет соответствовать имени всего интерфейса (или класса, в вашем случае), включая пространство имен, или оно не будет правильно маршрутизироваться.

Да, вы можете переопределить средство форматирования имени сущности, чтобы изменить способ именования тем, но это не изменит требования к типу сообщения для десериализации сообщения (что происходит по типу).

Поэтому здесь рекомендуется использоватьто же самое пространство имен для контрактов, даже если они находятся в отдельных проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...