第29章 分布式缓存强制删除触发器定义实现之IEventPublisher

news/2024/10/28 0:27:22/

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)。


http://www.ppmy.cn/news/21706.html

相关文章

第1章 MongoDB 教程

第1章 MongoDB 教程 MongoDB 是一个基于分布式文件存储的database。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系database和非关系database之间的产品&#xff0c;是非关系database当中功能最丰富&#xff0c;最像关系databa…

Biome-BGC生态系统模型与Python融合技术实践应用

查看原文>>> Biome-BGC生态系统模型与Python融合技术实践应用 Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xf…

cobaltstrike的shellcode免杀

基础概念 shellcode是一段用于利用软件漏洞而执行的代码&#xff0c;也可以认为是一段填充数据&#xff0c;shellcode为16进制的机器码&#xff0c;因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后&#xff0c;塞入一段可让CPU执行的s…

ADB 开启 USB调试后,无法自动弹出调试授权窗口的解决方法

之前介绍了 Android Device Unauthorized 的解决方案&#xff0c;这次将分享 开启 USB调试后&#xff0c;无法自动弹出调试授权窗口的解决方法。即使选择在 “仅充电” 的情况下去调试&#xff0c;结果都一样。 在我自己的工程机 (荣耀系列的) 连上电脑后&#xff0c;USB 连接方…

myBaits Target Capture Kits;myBaits 靶向捕获试剂盒,快速捕获富集目标序列

myBaits Target Capture Kits可以快速捕获富集目标序列&#xff0c;提高NGS研究效率&#xff0c;兼容Illumina&#xff0c;PacBio 和 Nanopore等多种测序平台。Arbor Biosciences使用oligo合成专利技术&#xff0c;为您提供高质量、高性价比的捕获试剂盒。适用于各种基因组类型…

湫湫系列故事——减肥记Ⅰ(Python)

Python——动态规划——湫湫系列故事——减肥记Ⅰ 湫湫系列故事——减肥记Ⅰ 问题引入 【问题描述】 对于吃货来说,过年最幸福的事就是吃了,没有之一!但是对于女生来说,卡路里(热量)是天敌啊!资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制…

Linux基本指令

文章目录&#xff1a;前言Linux基本指令1. whoami2. ls3.pwd4. clear5. cd6. touch7. tree8. nano9. stat10. mkdir11. rmdir12. rm13. man14. cp15. mv16. cat17.echo18. wc19. more20.less21. head22. tail23. 补充&#xff1a;|24. data25. car26. sort27. uniq28. find29. …

【C++修炼之路】C++入门(下)

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录一、前言二、内联函数1、概念2、特性三、auto&#xff08;C 11)1、概念2、价值3、三个不能四、范围for循环(C11)1、基本使用2、使…