Доступ из библиотеки классов в appsetting.json в Asp.net-core

Я пытаюсь получить доступ к appsetting.json файлу из библиотеки классов. Пока что решение, которое я нашел, - создать интерфейс реализации класса конфигурации IConfiguration из Microsoft.Extensions.Configuration и добавить json файл в класс и прочитать из него.

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");

Это, кажется, плохой вариант, поскольку мы должны каждый раз добавлять json файл каждый раз, когда нам нужно получить доступ к настройке appsetting. У нас нет альтернативы, например ConfigurationManager в ASP.NET.

Ответ 1

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

Я создаю класс модели, который имеет свойства, соответствующие настройкам в разделе в appsettings.json.

Раздел в appsettings.json

"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "[email protected];[email protected]"
}   

Соответствующий класс модели

namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}

Затем заполните этот класс модели и добавьте его в коллекцию IOptions в контейнере DI (это делается в методе Configure() класса Startup).

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));

// Other configuration stuff

services.AddOptions();

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

public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}

Затем, когда метод в библиотеке классов нуждается в настройках, я либо передаю параметры отдельно, либо передаю весь объект.

Ответ 2

Я знаю, что ответ уже принят, но этот вопрос является самым популярным вопросом в Google и OPs - это библиотеки классов, а не веб-приложение ASP.NET или WebApi, что и используется принятым ответом.

IMO, библиотеки классов не должны использовать настройки приложения и должны быть агностическими для таких параметров. Если вам нужны параметры приложения в вашей библиотеке классов, вы должны предоставить эти настройки у своего потребителя. Вы можете увидеть пример этого Об этом вопросе о себе

Ответ 3

Я знаю, что на этот вопрос есть принятый ответ, но вопрос о библиотеках классов и способ чтения appsettings.json из библиотеки классов заключается в следующем:

Создайте модель, свойства которой будут соответствовать свойствам в вашем файле настроек:

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}

Добавьте фактические настройки в ваш appsettings.json

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

Теперь зарегистрируйте раздел appsettings.json для своей модели в файле startup.cs:

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));

В вашей библиотеке классов создайте класс, который использует

using Microsoft.Extensions.Options;

И получите настройки вашей конфигурации:

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}

Для более подробной информации проверьте это

Ответ 4

Помимо вопросов, на которые есть принятый ответ, я считаю, что нет ни одного человека, который бы относился только к библиотеке классов, не имея проектов запуска или зависимостей со стеком Asp.NetCore или IServiceCollection.

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

using Microsoft.Extensions.Configuration;
using System.IO;

public class ConfigSample
{
    public ConfigSample
    {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));

            var root = builder.Build();
            var sampleConnectionString = root.GetConnectionString("your-connection-string");
    }
}

Требуются следующие пакеты nuget:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Newtonsoft.Json
  • Microsoft.Extensions.Configuration.Json

Ответ 5

Добавить ссылку на System.Configuration в проекте вы добавили класс, то это позволяет использовать все ключи. Это сработало для меня.