Как избежать избыточности кода в ASP.Net Core? - PullRequest
0 голосов
/ 18 октября 2018

Я реализовал 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: Извините, если этот вопрос кажется глупым, но я на самом деле новичок в ASP.NET Core и я хочу научиться создавать хорошую структуру проекта.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 18 октября 2018

Мне нужно повторно использовать метод, чтобы создать код и отправить электронное письмо

Это быстрая разметка, которую я не проверял, работает ли она.Вы хотите сделать что-то из следующего и использовать это в Dependency Injection (DI).Возможно, вам придется добавить IUrlHelper и IHttpContextAccessor

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...