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

时间:2018-10-18 17:57:36

标签: asp.net asp.net-core

我在应用程序中实现了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的接口方法的实现。

现在主要问题如下:我需要在ASP.NET Core类中使用相同的代码,因此不在{{1}}内使用,有没有地方可以存储这种类型的代码而无需创建冗余?

PS:很抱歉,这个问题看起来很愚蠢,但是我实际上是{{1}}的新手,我想学习如何创建一个好的项目结构。

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分: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);
    }
}