mak_ufo
@mak_ufo

Почему не инициализируются свойства сервиса при добавлении через AddTransient в ASP.NET Core?

Всем привет. Есть приложение на ASP.NET Core 2.0. Есть класс EmailService такого содержания:
public class EmailService : IEmailService
{
        public string _emailAddress;
        public string _emailPassword;
        public string _name;

        public async Task SendEmail(string toAddress, string subject, string text)
        {
            //некий код
        }
}


Пытаюсь добавить его как сервис в методе ConfigureServices так:
services.AddTransient<IEmailService, EmailService>();
services.Configure<EmailService>(options =>
{
    options._emailAddress = "email";
    options._emailPassword = "password";
    options._name = "name";
});


Проект успешно запускается и компилируется, но соответствующие поля класса EmailService остаются null. В чём может быть проблема?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@basrach
Потому что встроенный DI контейнер ASP. Net Core не поддерживает инъекцию свойств и полей.
А методом services.Configure вы на самом деле регистрируете опции, которые можно потом получить так: IOptions
Т.е. вам нужно сделать так:
services.AddTransient<IEmailService, EmailService>();
services.Configure<EmailServiceOptions>(options =>
{
    options._emailAddress = "email";
    options._emailPassword = "password";
    options._name = "name";
});

class EmailService
{
  public EmailService(IOptions<EmailServiceOptions> optionsAccessor)
  {
    _emailAddress = optionsAcessor.Value.EmailAddress;
    ....
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Используйте свойства, а не поля. Да и _ используется в именовании закрытых полей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы