第30章 分布式缓存强制删除触发器的触发调试

news2024/11/17 15:32:04

1 Services.Users.Caching.RoleCacheEventConsumer

using Core.Caching;

using Core.Domain.Users;

using Services.Caching;

namespace Services.Users.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在角色实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体实例的分布式缓存的强制移除操作提供数据支撑,从而为新变更的实例缓存操作,预留出相应的内存空间。

    /// </summary>

    public class RoleCacheEventConsumer : CacheEventConsumer<Role>

    {

        /// <param name="entity">角色实体的1个指定实例。</param>

        /// <summary>

        /// 【异步清理缓存】

        /// <remarks>

        /// 摘要:

        ///     执行插入、更新或删除操作时,从分布式数据库中强制移除1个指定的缓存项(/(“JSON”编码格式的)值对)和字典实例中强制移除1个指定的键/值对。

        /// </remarks>

        /// </summary>

        protected override async Task ClearCacheAsync(Role entity)

        {

            await RemoveByPrefixAsync(EntityCacheDefaults<Role>.AllCacheKey.Key);

        }

    }

}

2 重构Framework.Infrastructure.DependencyInjectionStartup. ConfigureServices

  services.AddSingleton<IEventPublisher, EventPublisher>();

            var typeFinder = Singleton<ITypeFinder>.Instance;

            //通过反射方式把继承于“IConsumer<>”接口的所有具体实现类进行实例化后,把这些实例注入到.Net(Core)内置容器中。

            var consumers = typeFinder.FindClassesOfType(typeof(IConsumer<>)).ToList();

            foreach (var consumer in consumers)

                foreach (var findInterface in consumer.FindInterfaces((type, criteria) =>

                {

                    var isMatch = type.IsGenericType && ((Type)criteria!).IsAssignableFrom(type.GetGenericTypeDefinition());

                    return isMatch;

                }, typeof(IConsumer<>)))

                    services.AddScoped(findInterface, consumer);

3 WebApi.Controllers.EventPublisherTestController

using Core.Caching;

using Core.Domain.Users;

using Core.Events;

using Data;

using LinqToDB;

using Microsoft.AspNetCore.Mvc;

using WebApi.Models;

namespace WebApi.Controllers

{

    [Route("[controller]/[action]")]

    [ApiController]

    public class EventPublisherTestController : ControllerBase

    {

        #region 拷贝构造方法与变量

        private readonly EFCoreContext _context;

        private readonly IStaticCacheManager _staticCacheManager;

        private readonly IEventPublisher _eventPublisher;

        public EventPublisherTestController(EFCoreContext context,

            IStaticCacheManager staticCacheManager,

            IEventPublisher eventPublisher)

        {

            _context = context;

            _staticCacheManager = staticCacheManager;

            _eventPublisher = eventPublisher;

        }

        #endregion

        [HttpGet]

        public async Task<MessageModel<bool>> EventPublisherTestAsync()

        {

            MessageModel<bool> _messageModel = new MessageModel<bool>();

            try

            {

                List<Role> _roleList = await _context.GetDbSet<Role>().ToListAsync();

                _staticCacheManager.PrepareKeyForDefaultCache(EntityCacheDefaults<Role>.AllCacheKey);

                await _staticCacheManager.SetAsync(_staticCacheManager.PrepareKeyForDefaultCache(EntityCacheDefaults<Role>.AllCacheKey), _roleList);

                Role _role = new Role() { Name = "EventPublisherTest", IsActive = true, Remark = "强制删除触发器的触发调试" };

                await _context.GetDbSet<Role>().AddAsync(_role);

                _context.SaveChanges();

                await _eventPublisher.EntityInsertedAsync(_role);

                _messageModel.Success = true;

                _messageModel.Message = "已经成功触发强制删除触发器!";

                return _messageModel;

            }

            catch (Exception exception)

            {

                _messageModel.Status = 500;

                _messageModel.Success = false;

                _messageModel.Message = "触发强制删除触发器失败:"+ exception.Message;

                return _messageModel;

            }

        }

    }

}

4 对于分布式缓存强制移除泛型注销器定义的一些思考

1、到目前为止.Net(Core)7的内置依赖注入容器依然不能自动的把多泛型继承类进行实例化,这是“CacheEventConsumer<TEntity>”类被定义为抽象类的原因,也是继承于“IConsumer<>”接口的所有具体实现类必须通过反射方式进行实例化的原因。

    2、本人认为对“CacheEventConsumer<TEntity>”类进行继承,从而实现多泛型继承类的实例化,并不是一种最好的解决方案,例如:“RoleCacheEventConsumer”,这样会增加程序定义实现的复杂性。

3、本人认为更好解决方案之一是:

    3.1、直接把“CacheEventConsumer<TEntity>”类被定义为单泛型继承类。

    3.2、直接把“CacheEventConsumer<TEntity>”类被定义为具体实现(非抽象)类。

    3.3、删除例如:“RoleCacheEventConsumer”这样的继承类。

    3.4、直接通过“CacheEventConsumer<TEntity>”类,实现分布式缓存强制移除操作,而非“RoleCacheEventConsumer”,这样的继承类。

4、本人认为更好解决方案之二是:

    4.1、通过第3方依赖注入容器:“Autofac.Extensions.DependencyInjection”,据说该依赖注入容器能够自动的把多泛型继承类进行实例化。

    4.2、直接把“CacheEventConsumer<TEntity>”类被定义为具体实现(非抽象)类。

    4.3、删除例如:“RoleCacheEventConsumer”这样的继承类。

    4.4、直接通过“CacheEventConsumer<TEntity>”类,实现分布式缓存强制移除操作,而非“RoleCacheEventConsumer”,这样的继承类。

    以上两种方案都是一种解决思路,没有经过测试,如果有时间,本人会重点以第一种思路方案对分布式缓存强制移除泛型注销器定义实现进行重构

对以上功能更为具体实现和注释见:230203_024shopDemo(分布式缓存强制删除触发器的触发调试)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux —— 文件系统概述、软硬链接与动静态库

目录 1.文件系统概述 1.1磁盘的基本存储结构 1.2磁盘的基本逻辑结构 1.3操作系统中的文件系统 1.4文件系统如何对磁盘进行管理 2.软链接、硬链接 2.1软链接 2.2硬链接 2.3目录的硬链接数 3.静态库和动态库 3.1静态库的制作 3.2静态库的使用 3.3动态库的制作 3.4动态…

年薪50k大佬带你五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f;自动化测试自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。特别是在敏捷模…

分布式请求链路跟踪-SpringCloud Sleuth

文章目录1.概述1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?1.2.是什么?1.3.如何解决问题?2.搭建链路监控步骤2.1.zipkin2.2.服务提供者2.3.服务消费者&#xff08;调用方&#xff09;2.4.测试1.概述 1.1.为什么会出现这个技术&#xff1f; 需要解决哪些问题?…

力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位积和之差 次数 、1295. 统计位数为偶数的数字、1394. 找出数组中的幸运数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——1108. IP 地址无效化、1281. 整数的各位…

手撕排序算法(一)——插入排序

排序的概念及意义本章内容我们采用C语言完成代码。排序的概念我们先来了解一下基础概念&#xff1a;排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序…

cin关闭流同步的利弊与cout的endl使用(超时问题)

重要&#xff1a;1&#xff1a;比如print&#xff0c;scanf&#xff0c;gets()&#xff0c;pus()&#xff0c;getchar()不要与cin&#xff0c;cout共用2&#xff1a;cout中不要使用endl每次使用endl&#xff0c;都要flush缓冲区&#xff0c;造成大量时间耗费。推荐cout <<…

springBoot国际化的一种方式

引言&#xff1a; 当我们的应用面向不同国家用户时&#xff0c;根据不同的locale返回不同的语言信息的国际化功能就显得有必要了。一般来说国际化主要表现在前端用户界面上&#xff0c;在现在前后端分离的背景下&#xff0c;前端页面的国际化交由前端代码独立完成&#xff1b;少…

只用两行代码做个表白二维码,赶快送给你心目中那个她吧♥(๑> ₃ <)♥

上一篇&#xff1a;教你一招完美解决 pptx 库安装失败的问题 今天有同事给我说&#xff1a;女朋友生日快到了&#xff0c;想用Python给她写个表白二维码&#xff0c;然后印在买的衣服上送给她。这么特别的生日礼物&#xff0c;博主还是第一次听到&#xff0c;不得不说&#xff…

Linux-make/Makefile

一、了解make/Makefile对于make/Makefile首先我们需要了解make是一条命令&#xff1b;Makefile是一个文件。make是一个命令&#xff0c;可以执行某条指令。这个我们理解&#xff0c;那Makefile是一个文件&#xff0c;那这个文件是干什么用的呢&#xff1f;这个文件内部一共包含…

SAP中新增销售科目配置分析实例

公司有一批呆滞维修用备件需要卖出&#xff0c;对应在系统内就需要做销售处理。但通常情况下&#xff0c;系统设计时没有考虑和配置备件销信也很正常。所以&#xff0c;处理时可能因为缺少配置做不下去。我需要解决配置问题&#xff0c;并做下可行性的测试。 首先考虑到的是末…

UniRx之ReactiveCommand

前言 UniRx中ReactiveCommand和AsyncReactiveCommand是一种基于IObservable的可控命令机制&#xff0c;用于控制是否允许进程运行 很难用文字说明&#xff0c;下面我们直接看代码吧 ReactiveCommand void Start() {//创建IObservable<bool>ReactiveProperty<bool&g…

分布式事务2种协议 及 4种模式

分布式事务协议 解决分布式事务&#xff0c;也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。 由于三阶段提交协议3PC非常难实现&#xff0c;目前市面主流的分布式事务解决方案都是2PC协议。 2PC&#xff1a;两阶段提交协议 两阶段提交协议&#xff1a;事务管理器分…

如何为客户创建一个简单好用的帮助文档?

产品售后服务难&#xff0c;客服人员压力大&#xff0c;客户不满意。相信这是很多企业都面临的问题&#xff0c;产品是卖出去了&#xff0c;但是做不完的售后&#xff0c;回答不完的重复问题&#xff0c;电话、微信响个不停&#xff0c;售后服务一直都是企业的一个痛点&#xf…

JSR303数据校验和@ControllerAdvice统一异常处理

1.引入依赖&#xff08;springboot2.3之后需要引入&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.6.6</version> </dependency>…

scrapy总结

一、scrapy是什么&#xff1f;*结构性数据&#xff1a;即同一类型的数据如&#xff1a;某一网页上的同一类型的标签二、scrapy安装pip install scrapy出错提示to update pip&#xff0c;请升级pippython -m pip install --upgrade pip三、scrapy的基本使用&#xff08;爬虫项目…

Python __del__()方法:销毁对象

Python 通过调用 __init__() 方法构造当前类的实例化对象&#xff0c;而本节要学的 __del__() 方法&#xff0c;功能正好和 __init__() 相反&#xff0c;其用来销毁实例化对象。事实上在编写程序时&#xff0c;如果之前创建的类实例化对象后续不再使用&#xff0c;最好在适当位…

Python爬虫-某懂车平台之汽车销量排行榜

前言 本文是该专栏的第33篇,后面会持续分享python爬虫干货知识,记得关注。 之前笔者在本专栏有详细介绍过该平台二手车数据,感兴趣的同学可以在本专栏往前翻阅查找。而本文要介绍的内容,是汽车销量排行数据。 地址:aHR0cHM6Ly93d3cuZG9uZ2NoZWRpLmNvbS9zYWxlcw== (注:地…

哪个牌子台灯对孩子视力好?精选不同价位的学生护眼台灯

在我国&#xff0c;由于科技水平的提高和电子产品的普及&#xff0c;儿童青少年的近视率正逐年攀升&#xff0c;且出现低龄化现象。2020年&#xff0c;我国儿童青少年总体近视率竟高达52.7%&#xff0c;其中6岁儿童已达14.3%&#xff0c;小学生为35.6%&#xff0c;初中生为71.1…

Hue(1): Apache Hue 介绍

1 Hue 是什么 HUEHadoop User Experience Hue 是一个开源的 Apache Hadoop UI 系统&#xff0c;由 Cloudera Desktop 演化而来&#xff0c;最后 Cloudera 公司将其贡献给 Apache 基金会的 Hadoop 社区&#xff0c;它是基于Python Web 框架 Django 实现的。 通过使用 Hue&am…

GAMES101笔记:BRDF和渲染方程

BRDF : 双向反射分布函数(Bidirectional Reflectance Distribution Function) 描述从某个方向入射的能量反射到不同的方向上的能量的分布。 理解反射 从能量的角度理解反射。上图中&#xff0c;ωi\omega_iωi​方向入射的光线具有的Radiance&#xff0c;累积在微小面积dAdAd…