1 Core.Events.IEventPublisher
namespace Core.Events
{
/// <summary>
/// 【事件触发--接口】
/// <remarks>
/// 摘要:
/// 通过继承于该接口的具体实现类中的方法成员用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public interface IEventPublisher
{
#region 方法
/// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)。</typeparam>
/// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>
/// <summary>
/// 【异步触发】
/// <remarks>
/// 摘要:
/// 该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
Task PublishAsync<TEvent>(TEvent @event);
/// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)。</typeparam>
/// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>
/// <summary>
/// 【触发】
/// <remarks>
/// 摘要:
/// 该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
void Publish<TEvent>(TEvent @event);
#endregion
}
}
2 Services.Events.EventPublisher
using Core.Events;
using Core.Infrastructure;
using System;
namespace Services.Events
{
/// <summary>
/// 【事件触发--类】
/// <remarks>
/// 摘要:
/// 通过该类中的方法成员用于实例化缓存项的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public class EventPublisher : IEventPublisher
{
#region 方法--接口实现
/// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)。</typeparam>
/// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>
/// <summary>
/// 【异步触发】
/// <remarks>
/// 摘要:
/// 该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public virtual async Task PublishAsync<TEvent>(TEvent @event)
{
//获取所有继承于“IConsumer”接口具体实现类的实例。
var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();
foreach (var consumer in consumers)
{
try
{
//在指定实体的1个实例执行插入、更新或持久化 / 逻辑删除操作后,触发执行缓存项的强制移除句柄,从而为新变更的实例缓存操作,预留出相应的内存空间。
await consumer.HandleEventAsync(@event);
}
catch (Exception exception)
{
//log error, we put in to nested try-catch to prevent possible cyclic (if some error occurs)
try
{
//var logger = EngineContext.Current.Resolve<ILogger>();
//if (logger == null)
// return;
//await logger.ErrorAsync(exception.Message, exception);
}
catch
{
// ignored
}
}
}
}
/// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)。</typeparam>
/// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>
/// <summary>
/// 【触发】
/// <remarks>
/// 摘要:
/// 该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public virtual void Publish<TEvent>(TEvent @event)
{
//获取所有继承于“IConsumer”接口具体实现类的实例。
var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();
foreach (var consumer in consumers)
try
{
//在指定实体的1个实例执行插入、更新或持久化 / 逻辑删除操作后,触发执行缓存项的强制移除句柄,从而为新变更的实例缓存操作,预留出相应的内存空间。
consumer.HandleEventAsync(@event).Wait();
}
catch (Exception exception)
{
//log error, we put in to nested try-catch to prevent possible cyclic (if some error occurs)
try
{
//var logger = EngineContext.Current.Resolve<ILogger>();
//if (logger == null)
// return;
//logger.Error(exception.Message, exception);
}
catch
{
// ignored
}
}
}
#endregion
}
}
3 Core.Events.EventPublisherExtensions
using Core.Domain;
namespace Core.Events
{
/// <summary>
/// 【事件触发器扩展--类】
/// <remarks>
/// 摘要:
/// 通过该类中的成员方法以指定事件触发类的指定实例进行实例化,从而为执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项提供实例支撑。
/// </remarks>
/// </summary>
public static class EventPublisherExtensions
{
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【异步实体插入】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static async Task EntityInsertedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
await eventPublisher.PublishAsync(new EntityInsertedEvent<T>(entity));
}
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【实体插入】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static void EntityInserted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
eventPublisher.Publish(new EntityInsertedEvent<T>(entity));
}
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【异步实体更新】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static async Task EntityUpdatedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
await eventPublisher.PublishAsync(new EntityUpdatedEvent<T>(entity));
}
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【实体更新】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static void EntityUpdated<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
eventPublisher.Publish(new EntityUpdatedEvent<T>(entity));
}
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【异步实体删除】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static async Task EntityDeletedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
await eventPublisher.PublishAsync(new EntityDeletedEvent<T>(entity));
}
/// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <param name="eventPublisher">事件触发类的1个指定实例。</param>
/// <param name="entity">指定实体的1/n实例。</param>
/// <summary>
/// 【实体删除】
/// <remarks>
/// 摘要:
/// 在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。
/// </remarks>
/// </summary>
public static void EntityDeleted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity
{
eventPublisher.Publish(new EntityDeletedEvent<T>(entity));
}
}
}
3.1 说明:
本人认为EventPublisherExtensions类定义在Services.Events命名空间更为丝滑,更为自然。
对以上功能更为具体实现和注释见:230202_023shopDemo(分布式缓存强制删除触发器定义实现之IEventPublisher)。