Доступ из библиотеки классов в 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
в проекте вы добавили класс, то это позволяет использовать все ключи. Это сработало для меня.