Является ли добавление службы AddMvc() дважды в ConfigureServices() хорошей практикой в ​​Asp.Net Core?

Я создаю пакет Nuget для ядра Asp.Net. Я хочу упростить настройку. Поэтому я решил предложить свободный способ добавления своего Nuget в коллекцию сервисов в ConfigureServices() в Asp.Net Core.

Вот что я планирую сделать:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => options....);

    services.AddMyNugetPackageName();
}

Внутри моего метода AddMyNugetPackageName(),

public static IServiceCollection AddMyNugetPackageName(this IServiceCollection services)
{
    services
        .AddMvc(options => options.ModelBinderProviders.Insert(0, new MyModelBinderProvider()))
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

    return services;
}

Итак, теперь, если люди начнут использовать мой пакет Nuget, заменит ли AddMvc() внутри моего AddMyNugetPackageName()AddMvc() в их ConfigureServices()? Не вызовет ли это каких-либо проблем у конечных пользователей?

Если это заменит AddMvc() пользователя в его ConfigureServices(), то каков наилучший подход или как с этим справиться?

Я бы сказал, что это не очень хорошая практика. Технически это не будет проблемой, потому что вы просто добавляете службы, но это означает, что дополнительные биты MVC, которые вы настраиваете, скрыты от пользователя и могут вызвать путаницу. Похоже, вы просто добавляете преобразователь контрактов JSON и настраиваемую привязку модели, почему бы просто не добавить эти две вещи?

DavidG 05.05.2019 10:52

@DavidG Да, даже я думаю о лучшем подходе!! Пожалуйста, не могли бы вы помочь мне, как это можно сделать лучше? Я также добавляю services.TryAddSingleton<IHttpContextAccessor,HttpContextAcc‌​essor>(); в свой AddMyNugetPackageName(). Так как же это лучше реализовать? Это то, что я подумал вместо того, чтобы просить моего конечного пользователя добавить эти три элемента в ConfigureServices() Я подумал, что было бы лучше, если бы я дал свободный подход

fingers10 05.05.2019 11:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
2
2 201
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать шаблон IConfigureOptions для внедрения конфигурации MvcOptions из вашего пакета nuget.

public class MyConfigureOptions : IConfigureOptions<MvcOptions>
{
    public void Configure(MvcOptions options)
    {
        options.ModelBinderProviders.Insert(0,new MyModelBinderProvider());
    }
}

Используйте ConfigureOptions, чтобы зарегистрировать свои варианты

public static IServiceCollection AddMyNugetPackageName(this IServiceCollection services)
{
    services.ConfigureOptions<MyConfigureOptions>();
}

Добавьте свои службы nuget в коллекцию служб.

services.AddMvc();
services.AddMyNugetPackageName();

Привет @ботинок. Спасибо, что научили меня новой технике. Как добавить AddJsonOptions() в MyConfigureOptions? Нужно ли мне наследовать другой интерфейс, такой как IConfigureOptions<MvcOptions>, IConfigureOptions<MvcJsonOptions>, и иметь два Configure(MvcOptions options) и Configure(MvcJsonOptions options)?

fingers10 08.05.2019 16:13

Да, это другой тип, который вы хотите настроить, поэтому создайте новый класс configOptions и еще один вызов ConfigureOptions

James Sampica 08.05.2019 20:06

Да, я так и поступил. Спасибо за вашу помощь и поддержку.

fingers10 09.05.2019 10:52

Деос это "добавит" к существующим MvcOptions или "заменит" их?

lonix 16.07.2021 14:23

Стоит добавить, что вы можете использовать services.Configure<MvcOptions>(o => { ..... });, если не хотите создавать новый класс для настройки параметров.

Connell 20.10.2021 14:45

Другие вопросы по теме