首页 文章

如何避免ASP.Net Core中的代码冗余?

提问于
浏览
0

我在我的应用程序中实现了 SendGrid ,在 Account 控制器中我有一个名为 Register 的方法 . 方法 Register 允许用户在网站上注册,在这个方法里面我有以下代码:

var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

var callbackUrl = Url.Action("ConfirmEmail", "Account", new
{
    userId = user.Id,
    token = code
}, protocol: Request.Scheme);

await _emailSender.SendEmailAsync(user.Email, _localizer["ConfirmYourEmail"], _localizer["ConfirmAccountTemplate", callbackUrl]);

如你所见,我生成一个确认码,然后我创建了一个 callBackUrl ,用户可以在电子邮件中找到该确认电子邮件地址 . 最后,我调用了 SendEmailAsync ,这实际上是 Microsoft.AspNetCore.Identity.UI.Services 的接口方法的一个实现 .

现在主要的问题如下:我需要在 Repository 类中使用相同的代码,所以不在 Controller 内,是否有地方存储这种类型的代码而不创建冗余?

PS:我'm sorry if this question seems stupid, but I' m实际上是 ASP.NET Core 的新手,我想学习如何创建一个好的项目结构 .

在此先感谢您的帮助 .

1 回答

  • 0

    我需要重用该方法来创建代码并发送电子邮件

    这是一个快速标记我没有测试这是否有效 . 您想要创建以下内容,并在依赖注入(DI)中使用它 . 您可能需要添加 IUrlHelperIHttpContextAccessor

    public class SomeClass : ISomeClass
    {
        private HttpContext _ctx;
        private IUrlHelper _url;
        private IConfiguration _localizer;
        private IEmailSender _emailSender;
        private UserManager<ApplicationUser> _userManager;
    
        public SomeClass(
            IUrlHelper url,
            IHttpContextAccessor ctx,
            IConfiguration config,
            IEmailSender emailSender,
            UserManager<ApplicationUser> userManager)
        {
            _ctx = ctx.HttpContext;
            _url = url;
            _localizer = config;
            _emailSender = emailSender;
            _userManager = userManager;
        }
    
        public async Task SendEmailWithCode(string email)
        {
            var user = await _userManager.FindByEmailAsync(email);
            var code = await _userManager.GeneratePasswordResetTokenAsync(user);
            var callbackUrl = _url.Action(nameof(ResetPassword), "Account", new { userId = user.Id, code }, protocol:  _ctx.Request.Scheme);
            await _emailSender.SendEmailAsync(user.Email, _localizer["ConfirmYourEmail"], _localizer["ConfirmAccountTemplate"], callbackUrl);
        }
    }
    

相关问题