【问题标题】:Concrete implementation of dependency injected service in ASP.NET Core 3 not being called未调用 ASP.NET Core 3 中依赖注入服务的具体实现
【发布时间】:2020-06-10 23:20:24
【问题描述】:

我阅读了Introduction to Identity on ASP.NET Core 以在我的 ASP.NET Core 3 Web 应用程序中实现身份服务。启用身份服务的部分演练是创建一个 EmailSender 类(描述为here)以发送帐户注册电子邮件等。我的问题是我的 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 自动生成注册、登录等代码,调用邮件服务如下:

公共类 RegisterModel : PageModel { ... 私有只读 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 是非 null 的事实意味着它看到了具体的实现。

【问题讨论】:

  • 检查配置服务中的顺序。也许在 authmessagesenderoptions 之后调用 emailservice?当您在密码可用之前注册电子邮件发件人时,我正在考虑密码等不存在
  • @JohanHerstad 不幸的是,结果没有变化。我确实进行了交换并尝试了它,但我还仔细检查了 Microsoft 文档并验证了正确的顺序。

标签: asp.net-core dependency-injection asp.net-core-identity


【解决方案1】:

我遇到了这个问题,经过一番摸索后,我注意到 Microsoft 的实现“覆盖”了我的 IEmailService 实现。通过从文件顶部的 Using 语句中删除它来解决这个问题。 我注释掉了这一行:

using Microsoft.AspNetCore.Identity.UI.Services;

//using Microsoft.AspNetCore.Identity.UI.Services;

这适用于您可能实现的任何其他接口,请检查 using 语句以了解任何其他现有实现。

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2020-02-05
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多