2017-01-20 2 views
9

Мне было интересно, есть ли способ получить доступ к Конфигурации (Microsoft.Extensions.Configuration) без использования инъекции зависимостей. Только примеры, которые я вижу, - это инъекция конструктора (с использованием IOptions или непосредственного ввода конфигурации).Доступ к конфигурации без инъекции зависимости

Моя дилемма заключается в том, что у меня есть класс утилиты - не служба, которая имеет статические методы, чтобы делать вещи «на лету». В некоторых из этих статических методов я хотел бы получить несколько свойств из appsettings.json динамически. Поскольку это строго класс утилиты, я не хочу вводить этот класс во все классы, которые должны использовать метод или два из утилиты.

Любые идеи о том, как получить доступ к свойствам appsettings.json без какой-либо инъекции зависимости.

FYI: с помощью C# и .net ядро ​​1,1

+0

http://stackoverflow.com/questions/38572081/access-app-key-data-from-class-libraries-in-net-core-asp-net-core вы это видели? – DanielGatti

+0

@ DanielGatti Ответы используют инъекции. Не то, что я ищу. Опять же, это мой класс полезности. Это не сервис, не имеющий интерфейса, не следует вводить. Все, что вам нужно сделать, это следующее: UtilityClass.DoSomething(); –

+0

Должны ли методы быть статическими? Может ли каждый класс, который должен использовать Утилиту, просто иметь частный член типа Utility, который устанавливается/создается при создании объекта класса? – BackDoorNoBaby

ответ

4

У меня есть утилита не class-- service--, который имеет статические методы

Это действительно сердце вашего вопроса. У вас есть статические методы с зависимостями, которые не являются дружественными к DI.

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

Вам следует избегать статических классов/методов для всего, что имеет (или может иметь) зависимости.

+2

И вот проблема: никто не может ответить на мой вопрос до сих пор, не используя DI. Класс утилиты не имеет зависимости от других классов. Это просто требует нескольких значений конфигурации из appsettings.json. Это все. Если мне нужно превратить каждый класс в «сервис», чтобы я мог вводить значения из настроек appsettings, тогда что-то действительно не так с каркасом. –

+0

Pre .NET Core вы могли бы сделать что-то вроде этого: ConfigurationManager.AppSettings ["MySetting"] или ConfigurationSettings.AppSettings.Get ("MySetting"). Я ищу что-то подобное, т. Е. Нет DI, в .NET Core –

+0

@LosMorales. Значит, вы пропустили старые дни жесткой связи? Научитесь уважать, что использование статических классов - плохой подход, и вы сможете адаптироваться. MVC Core управляется DI, поэтому вы должны * сделать свое приложение DI-friendly или у вас не будет ничего, кроме неприятностей. Не боритесь с тем, что статические методы устарели - обнимайте его, и вы найдете много новых и лучших способов создания приложений. Прочитайте [Injection Dependency in .NET] (https://www.manning.com/books/dependency-injection-in-dot-net), чтобы полностью понять все многочисленные способы улучшения этого подхода. – NightOwl888

3

Ничего себе, что много комментариев, почему люди не отвечают на вопрос, а не говорят кому-то, что они не хотят делать то, что они явно делают. В любом случае, мы надеемся, что это сохранит оба лагеря.

Если вы используете стандартный класс AppSettings с одним открытым конструктором, который принимает конфигурацию IConfiguration, которая может использоваться для заполнения всех свойств AppSettings, это сохраняет возможность инъекции зависимостей.

Если в конце конструктора установлено статическое свойство Current, указывающее на текущий экземпляр AppSettings, это позволит нам получить доступ к настройкам с этой точки через статическое свойство без необходимости дальнейшей инъекции.

Если мы создадим статический метод «GetCurrentSettings» по умолчанию, чтобы получить настройки из json-файла, это можно использовать как экземпляр по умолчанию, так что если «Current» вызывается и имеет значение null, мы просто отправляемся выключить и заполнить настройки из файла. Вот пример того, что я имею в виду ...

public class AppSettings 
{ 
    private static AppSettings _appSettings; 

    public string AppConnection { get; set; } 

    public AppSettings(IConfiguration config) 
    { 
     this.AppConnection = config.GetValue<string>("AppConnection"); 

     // Now set Current 
     _appSettings = this; 
    } 

    public static AppSettings Current 
    { 
     get 
     { 
      if(_appSettings == null) 
      { 
       _appSettings = GetCurrentSettings(); 
      } 

      return _appSettings; 
     } 
    } 

    public static AppSettings GetCurrentSettings() 
    { 
     var builder = new ConfigurationBuilder() 
         .SetBasePath(Directory.GetCurrentDirectory()) 
         .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
         .AddEnvironmentVariables(); 

     IConfigurationRoot configuration = builder.Build(); 

     var settings = new AppSettings(configuration.GetSection("AppSettings")); 

     return settings; 
    } 
} 

Так из этого вы могли бы позвонить в любую точку кода AppSettings.Current.AppConnection

Если он был создан экземпляр, используя DI впрыскиваемого версию можно извлечь в противном случае версия по умолчанию будет взята из файла appsettings.json. Я сомневаюсь, что это удовлетворяет всех, и я не уверен, что объяснил это очень хорошо, но, надеюсь, это имеет смысл.

+1

Плюс 1 за «почему люди просто не отвечают на вопрос». Мне так больно, что мне говорят, что я не должен делать то, что я прошу, как это сделать. – ProfK

0

Я только что сделал свойство конфигурации в Startup статическом:

public static IConfiguration Configuration { get; set; } 

Теперь я могу получить доступ к нему в любом месте приложения только с Startup.Configuration.

+1

Проблема с этим заключается в том, что теперь запущен запуск и зависимость для всех тех, для которых требуется конфигурация «статически». ИМО это не идеально, потому что это класс запуска - не цель. Недавний ответ с использованием настраиваемого класса AppSettings более уместен, поскольку он несколько имитирует ConfigurationManager.AppSettings из допотоковых дней, созданных специально для обслуживания конфигурации. Но да, ваше решение будет работать, если вы в порядке при запуске.Конфигурация из любого места в коде, требующем его. –

+0

@ LosMorales Да, но в приведенном выше ответе, используя «AppSettings», в него вводится конфиг. Если я собираюсь ввести там конфиг, я мог бы также ввести его туда, где он мне нужен, и это моя причина для этого вопроса. Например. Я использую 'var model = new ProductViewModel' и нуждаюсь в' IConfiguration' в этой модели просмотра, я не могу использовать введенный параметр. – ProfK

Смежные вопросы