Конкретная реализация службы внедрения зависимостей в ASP. NET Core 3 не вызывается - PullRequest
0 голосов
/ 27 февраля 2020

Я прочитал Введение в Identity в ASP. NET Core для реализации служб идентификации в моем ASP. NET Core 3 веб-приложении. Частью пошагового руководства по включению служб идентификации является создание класса EmailSender (описан здесь ) для отправки электронных писем регистрации учетной записи и т. Д. c. Моя проблема в том, что моя реализация EmailSender никогда не вызывается.

Следуя инструкциям на https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-3.1&tabs=visual-studio Я создал свою конкретную реализацию EmailSender:

public class EmailSender : IEmailSender
{
    public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
    {
        Options = optionsAccessor.Value;
    }

    ...
}

, затем я регистрирую эту службу (вместе с другими битами, связанными с идентификацией) в Startup.cs со структурой внедрения зависимостей:

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddDefaultIdentity<IdentityUser>(
                  options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddTransient<IEmailSender, EmailSender>();
    services.Configure<AuthMessageSenderOptions>(Configuration);

    ...
}

ASP. NET Core Identity Services автоматически генерирует код для регистрации, входа в систему и т. Д. c. и вызывает службу электронной почты следующим образом:

publi c class RegisterModel: PageModel {... private readonly IEmailSender _emailSender;

public RegisterModel(
    ...
    IEmailSender emailSender)
{
    ...
    _emailSender = emailSender;
}


 public async Task<IActionResult> OnPostAsync(string returnUrl = null)
 {
     ...
     await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
          $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
     ...
 }

У меня проблема в том, что EmailSender никогда не бывает инстанцирован. Точки останова на всех методах и конструкторе (даже сделанном конструктором по умолчанию в качестве теста) не удаляются.

В моей отладке я вижу, что RegisterModel создается, а emailSender установлен. Но когда F11 просматривает оператор, который вызывает отправителя электронной почты:

await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                        $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

, выполняется следующая следующая строка кода - никакой переход отладчика к EmailSender вообще.

Это похоже на DI Для меня проблема с регистрацией, но тот факт, что IEmailSender.emailSender не равен нулю, означает, что он видит конкретную реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...