未调用 ASP.NET Core 3 中依赖注入服务的具体实现

Posted

技术标签:

【中文标题】未调用 ASP.NET Core 3 中依赖注入服务的具体实现【英文标题】:Concrete implementation of dependency injected service in ASP.NET Core 3 not being called 【发布时间】: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 文档并验证了正确的顺序。 【参考方案1】:

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

using Microsoft.AspNetCore.Identity.UI.Services;

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

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

【讨论】:

以上是关于未调用 ASP.NET Core 3 中依赖注入服务的具体实现的主要内容,如果未能解决你的问题,请参考以下文章

在 asp.net Core 中配置服务注册时的依赖注入访问 (3+)

ASP.NET Core 依赖注入错误:尝试激活时无法解析服务类型 - 调用视图组件时出现错误 [重复]

理解ASP.NET Core

[ASP.NET Core 3框架揭秘] 依赖注入:一个Mini版的依赖注入框架

ASP.NET Core 依赖注入基本用法

ASP.NET Core 依赖注入(DI)