Инфраструктура опций настраивается по умолчанию в компоновщике хоста, поэтому вам не нужно AddOptions()
самостоятельно. Это, однако, также гарантирует, что вы можете использовать IOptions<T>
везде, где хотите, так как фреймворк предоставит вам этот объект опций.
Способ работы опций заключается в том, что фреймворк всегда даст вам T
(до тех пор, пока он может его создать) Когда вы настраиваете конфигурацию, используя, например, AddOptions<T>
или Configure<T>
, в действительности происходит то, что действие конфигурации регистрируется для этого типа T
. И когда IOptions<T>
будет позднее разрешен, все эти зарегистрированные действия будут выполняться в той последовательности, в которой они зарегистрированы.
Это означает, что для не настроен тип параметров. В этом случае будут использоваться значения по умолчанию для объекта. Конечно, это также означает, что вы не можете определить, действительно ли вы настроили тип параметров и является ли конфигурация действительной. Обычно это нужно делать при использовании значений.
Например, если вам требуется настроить Config1
, вы должны явно найти его:
public HelloWorldController(IOptions<UploadConfig> config)
{
if (string.IsNullOrEmpty(config.Value.Config1))
throw ArgumentException("Config1 is not configured properly");
}
В качестве альтернативы можно зарегистрировать действие проверки для типа, используя OptionsBuilder.Validate
. Затем он будет вызываться автоматически, когда вы повторно определяете объект параметров для проверки содержащего его значения. Таким образом, вы можете настроить проверку в центральном месте:
services.AddOptions<UploadConfig>()
.Bind(Configuration.GetSection("UploadConfig"))
.Validate(c => !string.IsNullOrEmpty(c.Config1));
К сожалению, это также означает, что вы можете обнаружить эти проблемы, только когда вы на самом деле используете значения, которые могут быть пропущены, если вы не проводите тщательное тестирование приложения. Обходным путем было бы разрешить параметры один раз при запуске приложения и проверить их там.
Например, вы можете просто ввести ваш IOptions<T>
в методе Configure
вашего запуска:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<UploadConfig> uploadOptions)
{
// since the options are injected here, they will be constructed and automatically
// validated if you have configured a validate action
// …
app.UseMvc();
}
В качестве альтернативы, если у вас есть несколько параметров, которые вы хотите проверить, и если вы хотите запустить логику, которая не вписывается в действие проверки, вы также можете создать службу, которая проверяет их:
public class OptionsValidator
{
private readonly IOptions<UploadConfig> uploadOptions;
public OptionsValidator(IOptions<UploadConfig> uploadOptions)
{
_uploadOptions = uploadOptions;
}
public void Validate()
{
if (string.IsNullOrEmpty(_uploadOptions.Value.Config1))
throw Exception("Upload options are not configured properly");
}
}
А затем введите это в свой Configure
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, OptionsValidator optionsValidator)
{
// validate options explicitly
optionsValidator.Validate();
// …
app.UseMvc();
}
Что бы вы ни делали, имейте в виду, что по умолчанию источники конфигурации настроены для поддержки обновления конфигурации во время выполнения. Таким образом, у вас всегда будет ситуация, когда конфигурация может быть временно недействительной во время выполнения.