IRabbitMqHost проблема с автоматической регистрацией - PullRequest
0 голосов
/ 12 июня 2019

Необходимо разрешить IRabbitMqHost для добавления обработчика в шину после запуска шины.

Шаги для воспроизведения

Регистрация "IRabbitMqHost" в конфигурации масстранзита Попробуй разрешить "IRabbitMqHost" в автофаке Затем было выдано «Исключение типа« Autofac.Core.Registration.ComponentNotRegisteredException »*

builder.Register(context =>
                {
                    var bus = Bus.Factory.CreateUsingRabbitMq(opt =>
                    {
                        var result = new List<string>();
                        Configuration.GetSection("RabbitMq:HostNames").Bind(result);

                        var host = opt.Host(result[0], Configuration.GetValue<string>("RabbitMq:VirtualHost"), h =>
                        {
                            h.Username(Configuration.GetValue<string>("RabbitMq:Username"));
                            h.Password(Configuration.GetValue<string>("RabbitMq:Password"));
                        });

                        builder.Register<IRabbitMqHost>(a => host);
                    });
                    return bus;
                }).As<IBus>()
                .As<IBusControl>();

builder.Build().Resolve<IRabbitMqHost>()

Ожидаемое поведение Необходимо разрешить IRabbitMqHost, который настроен в конфигурации IBus, потому что необходимо добавить обработчик после запуска шины. Нужно _rabbitMqHost.ConnectReceiveEndpoint () ...

Фактическое поведение container.Resolve выбрасывает исключение любимой. изображение в https://github.com/MassTransit/MassTransit/issues/1470

1 Ответ

0 голосов
/ 12 июня 2019

При регистрации на шине в autofac предоставляет функцию делегата, которая создает экземпляр шины и регистрирует хост.Но этот делегат еще не вызван.После сборки контейнерного сборщика и попытки разрешить IBus он вызывает делегат и регистрирует IRabbitMqHost, но не созданный контейнер.Затем, когда я пытаюсь решить IRabbitMqHost, он не находит зарегистрированный компонент, потому что добавленный контейнер не создан.

этот код работал для меня;

builder.Register(context =>
                {
                    var bus = Bus.Factory.CreateUsingRabbitMq(opt =>
                    {
                        var result = new List<string>();
                        Configuration.GetSection("RabbitMq:HostNames").Bind(result);

                        var host = opt.Host(result[0], Configuration.GetValue<string>("RabbitMq:VirtualHost"), h =>
                        {
                            h.Username(Configuration.GetValue<string>("RabbitMq:Username"));
                            h.Password(Configuration.GetValue<string>("RabbitMq:Password"));
                        });
                        ContainerBuilder b = new ContainerBuilder();
                        b.Register<IRabbitMqHost>(a => host).SingleInstance();
                        b.Update(ApplicationContainer);
                    });
                    return bus;
                }).As<IBus>()
                .As<IBusControl>()
                .SingleInstance();
``
...