В ASP.NET Core 2 у меня есть следующий класс, который принимает IOptions<T>
public class MyOptions
{
public string Option1 { get; set; }
public string Option2 { get; set; }
}
public class MyService:IMyService
{
private readonly MyOptions _options;
public MyService(IOptions<MyOptions> options)
{
_options = options.Value;
}
}
appsettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"MyOptions": {
"Option1": "option 1 value",
"Option2": "option 2 value"
}
}
Затем я запускаю.cs, я регистрирую параметры, как показано ниже
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
dotnet может внедрить IOptions<MyOptions> в класс MyService.
Теперь у меня есть тестовый проект интеграции. и я скопировал тот же файл appsettings.json в проект тестирования интеграции. Я хочу создать экземпляр IOptions<MyOptions>, который загружает значения из appsettings.json
public class MyTestClass
{
private readonly IConfigurationRoot _config;
public MyTestClass()
{
_config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
}
[Fact]
public void MyTest()
{
// arrange
// this line returns NULL
var optionValue = _config.GetSection("MyOptions").Value;
// i also tried GetValue which returns NULL as well
//var optionValue = _config.GetValue<MyOptions>("MyOptions");
var options = Options.Create<MyOptions>(optionValue);
var service = new MyService(options);
//act
// assert
}
}
_config.GetSection("MyOptions").Value и _config.GetValue<MyOptions>("MyOptions") возвращают ноль.
когда я быстро смотрю переменную _config, я вижу, что значения загружаются из appsettings.json






нашел это. я должен привязать экземпляр
var optionValue = new MyOptions();
_config.GetSection("MyOptions").Bind(optionValue);
var options = Options.Create<MyOptions>(optionValue);
или я также могу сделать
var optionValue = _config.GetSection("MyOptions").Get<MyOptions>();
var options = Options.Create<MyOptions>(optionValue);
Вы должны добавить пакет Nuget Microsoft.Extensions.Configuration.Binder, чтобы иметь метод расширения Bind или Get