2017-02-02 19 views
4

Я новичок в ядре ASP.NET и нуждаюсь в каком-то направлении. Я пытаюсь выяснить простой сценарий с использованием настроек приложения в ASP.NET Core, а также с помощью Simple Injector.Как использовать основные параметры приложения ASP.NET с простым инжектором

Сначала я установил параметры конфигурации «Мощного типа», как описано here от Rick Strahl. Это отлично работает.

public class MySettings 
    { 
    public string ApplicationName { get; set; } 
    } 

appsetting.json

{ 
    "Logging": { 
    "IncludeScopes": false, 
    "LogLevel": { 
     "Default": "Debug", 
     "System": "Information", 
     "Microsoft": "Information" 
    } 
    }, 
    "MySettings": { 
    "ApplicationName": "Test Service" 
    } 
} 

Startup.cs

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddMvc(); 

     // Add Options 
     services.AddOptions(); 

     // Add our Config object so it can be injected 
     services.Configure<MySettings>(Configuration.GetSection("MySettings")); 
     services.AddSingleton(GetTestBroker(container)); 

     //Simple Injector  
     //services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(container)); 
     //services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(container)); 


    } 

В других наших проектов используют простой Инжектор для DI. После добавления пакета Simple Injector и настройки его в соответствии с инструкциями я вижу, что моя конфигурация IOptions прерывается.

Что я хотел бы знать, было бы лучшей практикой для реализации конфигурации в ASP.NET Core и с использованием другой библиотеки DI, например Simple Injector?

+0

Лучшая практика работы с IOptions описана здесь: https://github.com/simpleinjector/SimpleInjector/issues/143#issuecomment-155029876 – Steven

+0

Я возьму взгляд. – Eric

+0

@Steven. Посмотрев на эту статью, похоже, что канавы IOptions - это консенсус. Затем просто зарегистрируйте свой POCO в качестве одиночного элемента в контейнере DI. Это то, с чем вы справлялись? – Eric

ответ

2

В ASP.NET Core integration guide for Simple Injector гласит следующее:

ASP.NET Ядро содержит новую модель конфигурации на основе IOption<T> абстракции. Мы не рекомендуем вводить зависимостей IOption<T> в ваши прикладные компоненты. Вместо этого компоненты напрямую зависят от объектов конфигурации и регистрируют их как Singleton. Это гарантирует, что значения конфигурации считываются во время запуска приложения и позволяют проверять их в тот момент времени, что позволяет приложению быстро работать.

Сдача компонентов приложения зависит от IOptions<T> имеет некоторые неудачные недостатки. Прежде всего, это приводит к тому, что код приложения принимает ненужную зависимость от абстракции структуры. Это является нарушением принципа впрыскивания зависимостей, который предписывает использование абстракций, адаптированных к приложениям. Инъекция IOptions<T> в компонент приложения делает этот компонент более сложным для тестирования, не прибегая к преимуществам. Вместо этого компоненты приложения должны напрямую зависеть от требуемых значений конфигурации.

IOptions<T> значения конфигурации читаются лениво. Хотя файл конфигурации может быть прочитан при запуске приложения, требуемый объект конфигурации создается только тогда, когда вызывается IOptions<T>.Value. При неудачной десериализации из-за неправильной конфигурации приложения такая ошибка появляется только после вызова IOptions<T>.Value. Это может привести к неправильным настройкам, чтобы оставаться незамеченными намного дольше, чем требуется. При чтении и подтверждении значений конфигурации при запуске приложения эту проблему можно предотвратить. Конфигурационные значения могут быть введены в виде одиночных элементов в компонент, который их требует.

Чтобы сделать вещи хуже, в случае, если вы забыли настроить определенный раздел (опуская вызов services.Configure<T>) или когда вы сделали опечатку при получении раздела конфигурации (путем подачи неправильного имени для Configuration.GetSection(name)), систему конфигурации просто предоставит приложение по умолчанию и пустой объект вместо исключения исключения! Это может иметь смысл в некоторых случаях, но это легко приведет к хрупким приложениям.

Поскольку вы хотите проверить конфигурацию при запуске, нет смысла откладывать ее чтение, и это делает неправильную инъекцию IOption в ваши компоненты.В зависимости от IOptions<T> все еще может быть полезно при загрузке приложения, но не в качестве зависимости нигде.

После того, как у вас есть правильно прочитать и проверить объект конфигурации, регистрация компонента, который требует объект конфигурации так же просто, как это:

MyMailSettings mailSettings = 
    config.GetSection("Root:SectionName").Get<MyMailSettings>(); 

// Verify mailSettings here (if required) 

container.Register<IMessageSender>(() => new MailMessageSender(mailSettings)); 
0

Я Автор ExistAll.SimpleConfig. SimpleConfig - это именно то, что необходимо для конфигурации/настроек в среде DI.

Посмотрите, чтобы увидеть, если это то, что вам нужно