繁体   English   中英

依赖注入不适用于带有 Azure Key Vault Value asp.net core 3.0 的 RabitMQ 服务总线

[英]Dependency Injection not working with RabitMQ Service Bus with Azure Key Vault Value asp.net core 3.0

我正在配置具有依赖关系的服务总线,如下所示

启动文件

services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));

来自 Vault 的值如下在此处输入图片说明

Vault 文件中的配置值如下

秘密.json

{
"ServiceBus": "{\"Transport\": \"RabbitMq\",\"RabbitMq\": {\"Url\": \"rabbitmq://localhost\",\"Username\": \"guest\",\"Password\": \"guest\"}}"
}

模型类

public class ServiceBusTransportOptions : IOptions<ServiceBusTransportOptions>
    {
        public TransportType Transport { get; set; } = TransportType.AzureServiceBus;

        public AzureServiceBusTransportOptions AzureServiceBus { get; set; }

        public RabbitMqTransportOptions RabbitMq { get; set; }

        public ServiceBusTransportOptions Value => this;
    }

var config = _.Resolve<IOptions<ServiceBusTransportOptions>>().Value;的值var config = _.Resolve<IOptions<ServiceBusTransportOptions>>().Value; 默认情况下不与 Vault 值映射。 所以导致空指针的经验

在此处输入图片说明

containerBuilder.Extension.cs

  public static void AddServiceBus(this ContainerBuilder builder,
            string applicationName,
            Action<IContainerBuilderConfigurator> configureMassTransitBuilder,
            Action<IComponentContext, IBusFactoryConfigurator> configureServiceBus)
        {
            builder.Register(
                    _ =>
                    {
                        var config = _.Resolve<IOptions<ServiceBusTransportOptions>>().Value;
                        switch (config.Transport)
                        {
                            case TransportType.AzureServiceBus:
                                return new AzureServiceBusConfigurationProvider(config.AzureServiceBus.Value) as
                                    IServiceBusConfigurationProvider;
                            case TransportType.RabbitMq:
                                return new RabbitMqServiceBusConfigurationProvider(config.RabbitMq.Value);
                            default:
                                return new InMemoryServiceBusConfigurationProvider() as
                                    IServiceBusConfigurationProvider;
                        }

                    })
                .As<IServiceBusConfigurationProvider>()
                .SingleInstance();
        }

无需手动反序列化。 从配置绑定到对象模型,并显式注册所需的类型

var configuration = new ConfigurationBuilder()
    .AddJsonFile("secret.json")
    .Build();
//"ConfigurationBinder.Gett<T>" method comes from
// Microsoft.Extensions.Configuration.Binder.dll
ServiceBusTransportOptions options = configuration.GetSection("ServiceBus").Get<ServiceBusTransportOptions>();
services.AddSingleton(options);

并根据需要解决

//...
builder.Register(_ => {
    var config = _.Resolve<ServiceBusTransportOptions>();
    switch (config.Transport) {
        case TransportType.AzureServiceBus:
            return new AzureServiceBusConfigurationProvider(config.AzureServiceBus.Value) as
                IServiceBusConfigurationProvider;
        case TransportType.RabbitMq:
            return new RabbitMqServiceBusConfigurationProvider(config.RabbitMq.Value);
        default:
            return new InMemoryServiceBusConfigurationProvider() as
                IServiceBusConfigurationProvider;
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM