I am configuring the service bus with dependency as below
Startup.cs
services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));
The value from the vault is as follows
The configured value from the vault file is as below
secrets.json
{
"ServiceBus": "{\"Transport\": \"RabbitMq\",\"RabbitMq\": {\"Url\": \"rabbitmq://localhost\",\"Username\": \"guest\",\"Password\": \"guest\"}}"
}
Model class
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;
}
The value of var config = _.Resolve<IOptions<ServiceBusTransportOptions>>().Value;
is default not mapped with the vault value. So causing a null pointer experception
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();
}
No need to manually deserialize. Bind to object model from configuration, and explicitly register the desired type
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);
And resolve as needed
//...
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;
}
})
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.