簡體   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