我正在配置带有依赖项的服务总线,如下所示
Startup.cs
services.AddSingleton<ServiceBusTransportOptions>(sp => JsonConvert.DeserializeObject<ServiceBusTransportOptions>(Configuration.GetSection("ServiceBus").Value));金库的价值如下

从保险库文件中配置的值如下
secrets.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;的值不是与金库值映射的。因此,导致一个空指针请求

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();
}发布于 2020-01-14 03:53:16
不需要手动反序列化。从配置绑定到对象模型,并显式注册所需的类型。
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;
}
})https://stackoverflow.com/questions/59727220
复制相似问题