я использую 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 никогда не срабатывает