未调用 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 依赖注入错误:尝试激活时无法解析服务类型 - 调用视图组件时出现错误 [重复]