Доступ к appsettings.json (в WepApi-проекте) в проекте библиотеки классов - PullRequest
0 голосов
/ 06 ноября 2018

Я знаю, что на эту проблему уже обращались ранее, но я не могу заставить ее работать в моем случае. Решение в Visual Studio содержит несколько проектов, включая WepApi-проект (ядро asp.net) и проект библиотеки классов. В проекте библиотеки классов мне нужно получить доступ к некоторой информации в appsettings.json, находящейся в WebApi-проекте. Я пытался следовать различным учебникам, что привело к следующему:

Appsettings.json

{
   "LoginSettings": {
   "email": "test@test.com",
   "password": "12345678"
   } 
}

Конфигурация моделирования класса (находится в проекте библиотеки классов):

LoginSettings

public class LoginSettings
{
    public string Email { get; set; }
    public string Password { get; set; }
}

Startup.cs (WebApi-проект):

public void ConfigureServices(IServiceCollection services)
{

     var loginSettings = new LoginSettings
     {
         Email = Configuration["LoginSettings:email"],
         Password = Configuration["LoginSettings:password"]
     };

     services.AddSingleton(loginSettings);
     services.AddOptions();
}

Класс, в котором мне нужны настройки

public static class Test
{
   private readonly LoginSettings settings;

   public static async Task<string> GetTokenAsync()
   {
       var email = settings.Email;

       ...
   }

}

Я ничего не могу получить от LoginSettings. Кроме того, я попытался сделать тестовый класс нестатичным, чтобы внедрить LoginSettings в конструктор. Но когда я пытаюсь создать экземпляр Test-класса, он запрашивает экземпляр LoginSettings. На самом деле я не чувствую, что тестовый класс нестатичен, так как его единственная цель - вернуть строку в другой класс, и для этого нужны параметры LoginSettings. Что я делаю не так?

Привет.

EDIT

Я сделал класс Test нестатичным. Что я передаю, когда говорю это?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Хорошо, я пытаюсь объяснить, как это работает в моем случае.

В моей ClassLibrary у меня есть следующий метод расширения

public static class MyClassLibraryExtensions
{
    public static IServiceCollection AddMyClassLibrary(this IServiceCollection services, LoginSettings options)
    {
        services.AddSingleton<LoginSettings>(options);
        return services;
    }
}

, затем в Web.API , проект

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();

    var loginSettings = new LoginSettings
    {
        Email = Configuration["LoginSettings:email"],
        Password = Configuration["LoginSettings:password"]
    };

    services.AddMyClassLibrary(loginSettings);
    ...
}

и используйте его

public class Test
{
   private readonly LoginSettings _settings;

   public Test(LoginSettings loginSettings)
   {
        _settings = loginSettings;
   }

   public static async Task<string> GetTokenAsync()
   {
       var email = _settings.Email;

       ...
   }
}
0 голосов
/ 06 ноября 2018

В Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<LoginSettings>(Configuration.GetSection("LoginSettings"));
}

В контроллере:

public class HomeController : Controller
{
    private string _email { get; set; }
    private string _password { get; set; }

    public HomeController(IOptions<LoginSettings> options)
    {
        var login = options.Value;
        _email = login.Email;
        _password = login.Password;
    }

    public IActionResult GetTokenAsync()
    {
        // _email: "test@test.com"
        // _password: "12345678"
    }
}

ПРИМЕЧАНИЕ : Я предлагаю вам назвать имя свойства в appsettings.json следующим образом:

{
   "LoginSettings": {
       "Email": "test@test.com",
       "Password": "12345678"
   } 
}

Используйте Email и Password вместо email и password.

ОБНОВЛЕНИЕ (для I'm not going to use the LoginSettings in a controller. I'm going to use it in a class in the class library project):

public class MyLib
{
    private string _email { get; set; }
    private string _password { get; set; }

    public MyLib(IOptions<LoginSettings> options)
    {
        var login = options.Value;
        _email = login.Email;
        _password = login.Password;
    }

    public async Task<string> GetTokenAsync()
    {
        // _email: "test@test.com"
        // _password: "12345678"
    }
}

ОБНОВЛЕНИЕ 2

Для использования этой библиотеки. Вы не можете использовать это так:

var lib = new MyLib(???)

Поскольку MyLib (или Test в вашем примере) является службой, вы передаете его в другой конструктор перед использованием:

public class AnotherClass
{
    private MyLib _lib { get; set; }

    public AnotherClass(MyLib lib)
    {
        _lib = lib;
    }

    public async Task UseIt()
    {
        var token = await _lib.GetTokenAsync();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...