Как отловить исключение привязки конфигурации? - PullRequest
1 голос
/ 10 июля 2019

Я создаю консольное приложение в .NET Core 2.2.

Я добавил строго типизированную конфигурацию, например:

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();

services.Configure<AppConfiguration>(configuration);

Моя конфигурация привязана к объекту класса AppConfiguration.Интересно, как я могу перехватить исключения, которые могут произойти при привязке значений конфигурации к моему классу?Например, одно из моих свойств конфигурации - это enum.Если пользователь предоставляет несуществующий параметр, я получаю исключение с трассировкой стека:

в System.Enum.TryParseEnum (тип enumType, значение String, логическое значение ignoreCase, EnumResult & parseResult) в System.Enum.Parse (тип enumType, Строковое значение, Boolean ignoreCase) в System.ComponentModel.EnumConverter.ConvertFrom (контекст ITypeDescriptorContext, CultureInfo culture, Значение объекта)

По сути, мне нужен какой-то способ узнать, что произошло исключение из-за неправильной конфигурации, ине какая-то другая проблема.Если бы мне удалось перехватить какие-либо исключения, связанные с привязкой конфигурации, я мог бы выдать свое собственное исключение WrongConfigurationException, чтобы перехватить его и убедиться, что что-то не так с config.

1 Ответ

1 голос
/ 10 июля 2019

Сбой рано, охотно получая / привязывая нужный объект из конфигурации и перехватывая любые исключения, возникающие при запуске.

Ссылка Привязка к графу объектов

//...

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();

try {
    //bind to object graph
    AppConfiguration appConfig = configuration.Get<AppConfiguration>();

    //custom validation can be done here as well
    //...        

    //if valid add to service collection.
    services.AddSingleton(appConfig);    
} catch(Exception ex) {
    throw new WrongConfigurationException("my message here", ex);
}

//...

Обратите внимание, что в приведенном выше примере класс может быть явно введен в зависимости без необходимости заключаться в IOptions<T>, что имеет свои собственные конструктивные последствия

Try-catch также можно отказаться, просто допустив провал в этот момент.

//...

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();


//bind to object graph
AppConfiguration appConfig = configuration.Get<AppConfiguration>();

//custom validation can be done here as well
if(/*conditional appConfig*/)
    throw new WrongConfigurationException("my message here");

//if valid add to service collection.
services.AddSingleton(appConfig);    

//...

В нем должно быть легко указано, где и почему было сгенерировано исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...