vNext 控制台应用程序中的 OptionsModel 依赖项注入
OptionsModel dependency injection in vNext console application
我有一个 vNext 控制台应用程序,其中我的一个 classes 使用 OptionsModel<T>
POCO 配置设置 class.
我无法解决 POCO 设置 class 并注入到我的 RabbitMqConnection
class 下面。
设置 ServiceProvider
不是问题,问题是设置的分辨率 class。
请注意,这是一个 vNext 控制台应用程序(不是 mvc6 应用程序)。
我的第二个问题是,我知道构造函数参数应该保持最小,但是最好将两个字符串作为构造函数参数而不是 IOptions
class 作为前一种方法传递更能描述 RabbitMqConnection
class 的要求?如果是这样,如何最好地从定义映射的 class 注入(下面示例中的 Program.cs
文件)
public class RabbitMqConnection
{
public string HostName { get; set; }
public string UserName { get; set; }
public RabbitMqConnection(IOptions<MessagingSettings> settings)
{
HostName = settings.Value.HostName;
UserName = settings.Value.UserName;
}
}
public class MessagingSettings
{
public string HostName { get; set; }
public string UserName { get; set; }
}
appsettings.json
{
"MessagingSettings":{
"HostName":"localhost",
"Username":"guest"
}
}
public void ConfigureServices(IServiceCollection services)
{
// tried registration a number of ways as below
services.Configure<MessagingSettings>(Configuration.GetSection("MessagingSettings"));
services.Configure<MessagingSettings>(Configuration);
// attempt 1 - get runtime error saying cant resolve IOptions<MessageSettings>
services.TryAdd(ServiceDescriptor.Singleton<RabbitMqConnection, RabbitMqConnection>());
// attempt 2 - same as above, when i breakpoint on messagingSettings, all the values in the object are null
services.TryAdd(ServiceDescriptor.Singleton<RabbitMqConnection>(factory =>
{
// instead of injecting the MessageSettings, pass through the string values (constructor omitted for clarity)
var messagingSettings = Configuration.Get<MessagingSettings>();
return new RabbitMqConnection(messagingSettings.HostName, messagingSettings.UserName);
}));
}
var conn = ServiceProvider.GetRequiredService<RabbitMqConnection>();
您需要致电services.AddOptions()
我有一个 vNext 控制台应用程序,其中我的一个 classes 使用 OptionsModel<T>
POCO 配置设置 class.
我无法解决 POCO 设置 class 并注入到我的 RabbitMqConnection
class 下面。
设置 ServiceProvider
不是问题,问题是设置的分辨率 class。
请注意,这是一个 vNext 控制台应用程序(不是 mvc6 应用程序)。
我的第二个问题是,我知道构造函数参数应该保持最小,但是最好将两个字符串作为构造函数参数而不是 IOptions
class 作为前一种方法传递更能描述 RabbitMqConnection
class 的要求?如果是这样,如何最好地从定义映射的 class 注入(下面示例中的 Program.cs
文件)
public class RabbitMqConnection
{
public string HostName { get; set; }
public string UserName { get; set; }
public RabbitMqConnection(IOptions<MessagingSettings> settings)
{
HostName = settings.Value.HostName;
UserName = settings.Value.UserName;
}
}
public class MessagingSettings
{
public string HostName { get; set; }
public string UserName { get; set; }
}
appsettings.json
{
"MessagingSettings":{
"HostName":"localhost",
"Username":"guest"
}
}
public void ConfigureServices(IServiceCollection services)
{
// tried registration a number of ways as below
services.Configure<MessagingSettings>(Configuration.GetSection("MessagingSettings"));
services.Configure<MessagingSettings>(Configuration);
// attempt 1 - get runtime error saying cant resolve IOptions<MessageSettings>
services.TryAdd(ServiceDescriptor.Singleton<RabbitMqConnection, RabbitMqConnection>());
// attempt 2 - same as above, when i breakpoint on messagingSettings, all the values in the object are null
services.TryAdd(ServiceDescriptor.Singleton<RabbitMqConnection>(factory =>
{
// instead of injecting the MessageSettings, pass through the string values (constructor omitted for clarity)
var messagingSettings = Configuration.Get<MessagingSettings>();
return new RabbitMqConnection(messagingSettings.HostName, messagingSettings.UserName);
}));
}
var conn = ServiceProvider.GetRequiredService<RabbitMqConnection>();
您需要致电services.AddOptions()