C# 依赖项注入不适用于具有Azure密钥保险库值asp.net core 3.0的RabitMQ服务总线
我正在使用依赖项配置服务总线,如下所示 Startup.csC# 依赖项注入不适用于具有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 :
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));使用代码生成器