C# 依赖项注入不适用于具有Azure密钥保险库值asp.net core 3.0的RabitMQ服务总线

C# 依赖项注入不适用于具有Azure密钥保险库值asp.net core 3.0的RabitMQ服务总线,c#,asp.net-core,dependency-injection,rabbitmq,asp.net-core-mvc,C#,Asp.net Core,Dependency Injection,Rabbitmq,Asp.net Core Mvc,我正在使用依赖项配置服务总线,如下所示 Startup.cs services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value)); public class ServiceBusTransportOptions :

我正在使用依赖项配置服务总线,如下所示

Startup.cs

services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));
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;
    }
  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();
        }
模型类

services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));
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;
    }
  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();
        }
公共类ServiceBustTransportOptions:IOOptions
{
public TransportType Transport{get;set;}=TransportType.AzureServiceBus;
公共AzureServiceBustTransportOptions AzureServiceBus{get;set;}
公共RabbitMqTransportOptions RabbitMq{get;set;}
公共服务BustTransportOptions值=>此;
}
var config=..Resolve().value的值默认不与vault值映射。因此导致空指针experception

containerBuilder.Extension.cs

services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));
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;
    }
  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();
        }
public static void AddServiceBus(此ContainerBuilder生成器,
字符串applicationName,
操作配置MassTransitBuilder,
操作(配置服务总线)
{
建筑商登记(
_ =>
{
var config=uwk.Resolve().Value;
交换机(config.Transport)
{
case TransportType.AzureServiceBus:
将新的AzureServiceBusConfigurationProvider(config.AzureServiceBus.Value)返回为
IServiceBusConfiguration提供程序;
案例TransportType.RabbitMq:
返回新的RabbitMqServiceBusConfigurationProvider(config.RabbitMq.Value);
违约:
将新的InMemoryServiceBusConfigurationProvider()返回为
IServiceBusConfiguration提供程序;
}
})
.As()
.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);
var configuration=new ConfigurationBuilder()
.AddJsonFile(“secret.json”)
.Build();
//“ConfigurationBinder.Gett”方法来自
//Microsoft.Extensions.Configuration.Binder.dll
ServiceBustTransportOptions=configuration.GetSection(“ServiceBus”).Get();
服务。AddSingleton(选项);
并根据需要解决问题

//...
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;
    }
})
/。。。
builder.Register(=>{
var-config=uwk.Resolve();
交换机(config.Transport){
case TransportType.AzureServiceBus:
将新的AzureServiceBusConfigurationProvider(config.AzureServiceBus.Value)返回为
IServiceBusConfiguration提供程序;
案例TransportType.RabbitMq:
返回新的RabbitMqServiceBusConfigurationProvider(config.RabbitMq.Value);
违约:
将新的InMemoryServiceBusConfigurationProvider()返回为
IServiceBusConfiguration提供程序;
}
})

由于该值不在appsetting.json上,因此它们位于本地的vault文件中,它来自secret.json。这些值类似于{“ServiceBus”:“{\“Transport\”:\“RabbitMq\”,\“RabbitMq\”:{“Url\”:\”rabbitmq://localhost\“,”用户名\“:\”客人\“,”密码\“:\”客人\“}}”所以我需要得到应得的回报it@SanJaisy您可以将其加载到IConfiguration中。请告诉我。我对这项为我服务的工作感到困惑。AddSingleton(JsonConvert.DeserializeObject(Configuration.GetSection(“ServiceBus”).Value));使用代码生成器