首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入不适用于具有Azure密钥库值的RabitMQ服务总线asp.net核心3.0

依赖注入不适用于具有Azure密钥库值的RabitMQ服务总线asp.net核心3.0
EN

Stack Overflow用户
提问于 2020-01-14 03:38:02
回答 1查看 204关注 0票数 2

我正在配置带有依赖项的服务总线,如下所示

Startup.cs

代码语言:javascript
复制
services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));

金库的价值如下

从保险库文件中配置的值如下

secrets.json

代码语言:javascript
复制
{
"ServiceBus": "{\"Transport\": \"RabbitMq\",\"RabbitMq\": {\"Url\": \"rabbitmq://localhost\",\"Username\": \"guest\",\"Password\": \"guest\"}}"
}

模型类

代码语言:javascript
复制
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;的值不是与金库值映射的。因此,导致一个空指针请求

containerBuilder.Extension.cs

代码语言:javascript
复制
  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();
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 03:53:16

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

代码语言:javascript
复制
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);

并视需要而定

代码语言:javascript
复制
//...
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;
    }
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59727220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档