Создание данных уведомления для IRealTimeNotifier - PullRequest
0 голосов
/ 30 июня 2019

я использую aspNetboilerplate и внедрил IRealTimeNotifier для отправки электронной почты пользователям, когда определенные действия выполняются на прикладном уровне.

У меня проблемы со сборкой данных уведомления для передачи в IRealTimeNotifer, как показано в примере на следующей странице:

[https://aspnetboilerplate.com/Pages/Documents/Notification-System#multiple-notifiers][1]

Мой emailRealTimeNotifer точно такой, как вы видите на сайте

public class EmailRealTimeNotifier : IRealTimeNotifier, ITransientDependency
{
    private readonly IEmailSender _emailSender;
    private readonly UserManager _userManager;

    public EmailRealTimeNotifier(
        IEmailSender emailSender,
        UserManager userManager)
    {
        _emailSender = emailSender;
        _userManager = userManager;
    }

    public async Task SendNotificationsAsync(UserNotification[] userNotifications)
    {
        foreach (var userNotification in userNotifications)
        {
            if (userNotification.Notification.Data is MessageNotificationData data)
            {
                var user = await _userManager.GetUserByIdAsync(userNotification.UserId);

                _emailSender.Send(
                    to: user.EmailAddress,
                    subject: "You have a new notification!",
                    body: data.Message,
                    isBodyHtml: true
                );
            }
        }
    }
}

Затем я включил это в модуль предварительной инициализации:

Configuration.Notifications.Notifiers.Add<EmailRealTimeNotifier>();

Я вызываю следующее из уровня приложения:

await _emailNotifier.SendNotificationsAsync(userNotification.ToArray());

после введения зависимости:

    private readonly EmailRealTimeNotifier _emailNotifier;
EmailRealTimeNotifier emailNotifier
_emailNotifier = emailNotifier;

Я пытался создать объект UserNotification перед его передачей в IRealTimeNotifier, однако я получаю ошибку исключения нулевой ссылки в перехвате попытки моего уровня приложения.

Может кто-нибудь подсказать, как я мог бы создать это уведомление пользователя или указать правильный способ доступа к этой функции.

** Обновлен согласно комментариям, чтобы включить фактический вызов и трассировку стека **

        try
        {
            var userNotificationList = new List<UserNotification>();
            var userNotification = new UserNotification();
            var notificationData = new NotificationData();
            var messageNotificationData = new MessageNotificationData("Test");

            userNotification.UserId = (long)AbpSession.UserId;
            userNotification.Notification.Data = messageNotificationData;

            userNotificationList.Add(userNotification);

            await _emailNotifier.SendNotificationsAsync(userNotificationList.ToArray());
        }
        catch (Exception e)
        {
            var test = e;
            throw;
        }

Stacktrace - это:

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Информация: Выполнение метода действия ESMPortal.Users.UserAppService.Update (ESMPortal.Application) с аргументами (ESMPortal.Users.Dto.UserDto) - Состояние проверки: допустимое исключение: «System.NullReferenceException» в ESMPortal.Application.dll 'dotnet.exe' (CoreCLR: clrhost): загружен 'C: \ Program Файлы \ DotNet \ Shared \ Microsoft.NETCore.App \ 2.2.4 \ System.Diagnostics.StackTrace.dll». Пропущены символы загрузки. Модуль оптимизирован и опция отладчика «Просто мой код» включен. 'dotnet.exe' (CoreCLR: clrhost): загружен «C: \ Program Файлы \ DotNet \ Shared \ Microsoft.NETCore.App \ 2.2.4 \ System.Reflection.Metadata.dll». Пропущены символы загрузки. Модуль оптимизирован и опция отладчика «Просто мой код» включен. 'dotnet.exe' (CoreCLR: clrhost): загружен «C: \ Program Файлы \ DotNet \ Shared \ Microsoft.NETCore.App \ 2.2.4 \ System.IO.MemoryMappedFiles.dll». Пропущены символы загрузки. Модуль оптимизирован и опция отладчика «Просто мой код» включен.

имеет сообщение:

Message = "Ссылка на объект не установлена ​​для экземпляра объекта."

точка останова в верхней части моего класса RealTimeNotifier никогда не срабатывает

1 Ответ

1 голос
/ 01 июля 2019

IRealTimeNotifier предназначен для вызова ABP при вызове _notificationPublisher.PublishAsync.

Создает уведомление в таблице AbpNotifications в базе данных.

var notificationName = "NotificationName";
var message = "Test";
var userIds = new [] { AbpSession.ToUserIdentifier() };

await _notificationPublisher.PublishAsync(
    notificationName,
    data: new MessageNotificationData(message),
    userIds: userIds
);

В вашем случае вы можете позвонить _emailSender напрямую.

var user = await _userManager.GetUserByIdAsync(AbpSession.UserId.Value);
var message = "Test";

_emailSender.Send(
    to: user.EmailAddress,
    subject: "You have a new notification!",
    body: message,
    isBodyHtml: true
);
...