using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Sanhe.Abp.IdGenerator; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Uow; namespace Sanhe.Abp.Notifications.Internal { /// /// 默认实现通过分布式事件发送通知 /// 可替换实现来发送实时通知 /// public class NotificationSender : INotificationSender, ITransientDependency { /// /// Reference to . /// public ILogger Logger { get; set; } /// /// Reference to . /// public IDistributedEventBus DistributedEventBus { get; } /// /// Reference to . /// protected IDistributedIdGenerator DistributedIdGenerator { get; } /// /// Reference to . /// protected IUnitOfWorkManager UnitOfWorkManager { get; } /// /// 通知选项 /// protected AbpNotificationsOptions Options { get; } public NotificationSender( IDistributedEventBus distributedEventBus, IDistributedIdGenerator distributedIdGenerator, IUnitOfWorkManager unitOfWorkManager, IOptions optionsAccessor) { Options = optionsAccessor.Value; DistributedEventBus = distributedEventBus; DistributedIdGenerator = distributedIdGenerator; UnitOfWorkManager = unitOfWorkManager; Logger = NullLogger.Instance; } public async Task SendNofiterAsync( string name, NotificationData data, UserIdentifier user = null, Guid? tenantId = null, NotificationSeverity severity = NotificationSeverity.Info) { if (user == null) { return await PublishNofiterAsync(name, data, null, tenantId, severity); } else { return await PublishNofiterAsync(name, data, new List { user }, tenantId, severity); } } public async Task SendNofitersAsync( string name, NotificationData data, IEnumerable users = null, Guid? tenantId = null, NotificationSeverity severity = NotificationSeverity.Info) { return await PublishNofiterAsync(name, data, users, tenantId, severity); } protected async Task PublishNofiterAsync( string name, NotificationData data, IEnumerable users = null, Guid? tenantId = null, NotificationSeverity severity = NotificationSeverity.Info) { var eto = new NotificationEto(data) { Id = DistributedIdGenerator.Create(), TenantId = tenantId, Users = users?.ToList(), Name = name, CreationTime = DateTime.Now, Severity = severity }; if (UnitOfWorkManager.Current != null) { UnitOfWorkManager.Current.OnCompleted(async () => { await DistributedEventBus.PublishAsync(eto); }); } else { await DistributedEventBus.PublishAsync(eto); } return eto.Id.ToString(); } } }