第13章 CacheService角色实体的CURD操作示例

news/2024/11/15 3:53:08/

1 Services.Customers.CustomerServiceDefaults

using Core.Caching;

using Core.Domain.Customers;

namespace Services.Customers

{

    /// <summary>

    /// 【用户服务默认--类】

    /// <remarks>

    /// 摘要:

    ///    该类中的属性成员实例设定一些常量值,为用户服务相关类的定义实现提供相应的支撑。

    /// </remarks>

    /// </summary>

    public static class CustomerServicesDefaults

    {

        #region  缓存--角色缓存键实例

        /// <summary>

        /// 【所有角色缓存键】

        /// <remarks>

        /// 摘要:

        ///     设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。  

        /// {0} : 布尔值字符串,为缓存键字符串的拼接提供数据支撑,如果该布尔值字符串为:“True”,则缓存键字符所对应缓存项中存储着角色实体的所有实例;

        ///     如果该布尔值字符串为:“False”,则缓存键字符所对应缓存项中存储着处于激活状态的角色实体的所有实例。

        /// </remarks>

        /// </summary>

        public static CacheKey RolesAllCacheKey => new("role.all.{0}", EntityCacheDefaults<Role>.AllPrefix);

        #endregion

    }

}

2 Services.Customers.ICustomerService

using Core.Domain.Customers;

namespace Services.Customers

{

    public interface ICustomerService

    {

        #region 方法--角色

        /// <param name="showHidden">指示是否获取角色实体的所有实例,默认值:false,即只获取处于激活状态的角色实体的所有实例。</param>

        /// <summary>

        /// 【异步获取所有角色】

        /// <remarks>

        /// 摘要:

        ///     直接从角色表中1个指定实体的所有实例;或从分布式缓存数据库获取角色实体的所有实例。

        /// </remarks>

        /// <returns>

        ///    列表实例,该实例存储着角色实体的所有实例。

        /// </returns>

        /// </summary>

        Task<IList<Role>> GetAllCustomerRolesAsync(bool showHidden = false);

        /// <param name="roleId">角色实体1个指定实例的长整型编号值。</param>

        /// <summary>

        /// 【异步通过编号值获取角色】

        /// <remarks>

        /// 摘要:

        ///     直接从角色表中获取1个指定的角色实例;或从分布式缓存数据库获取1个指定的角色实例。

        /// </remarks>

        /// <returns>

        ///    1个指定的角色实例。

        /// </returns>

        /// </summary>

       Task<Role> GetRoleByIdAsync(long roleId);

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

        /// <summary>

        /// 【异步插入角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task InsertRoleAsync(Role role);

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步批量插入角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例批量持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task InsertRoleAsync(IList<Role> roleList);

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

        /// <summary>

        /// 【异步更新角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例持久化更新到角色表中后,并从缓存数据库中移除与角色实体相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task UpdateRoleAsync(Role role);

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步批量更新角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例批量持久化更新到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task UpdateRoleAsync(IList<Role> roleList);

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

        /// <summary>

        /// 【异步物理删除角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例从角色表中物理删除后,并从缓存数据库中移除与角色实体相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task DeleteRoleAsync(Role role);

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步物理批量删除角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例从角色表中物理批量删除后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        Task DeleteRoleAsync(IList<Role> roleList);

        #endregion

    }

}

3 Services.Customers.CustomerService

using Core.Caching;

using Core.Domain.Customers;

using Data;

using Microsoft.EntityFrameworkCore;

namespace Services.Customers

{

    public class CustomerService : ICustomerService

    {

        #region 拷贝构造方法与变量

        private readonly IRepository<Role> _roleRepository;

        private readonly IStaticCacheManager _staticCacheManager;

        /// <summary>

        /// 【拷贝构建方法】

        /// <remarks>

        /// 摘要:

        ///     依赖注入容器通过拷贝构造方法,实例化该类中的变量成员。

        /// </remarks>

        /// </summary>

        public CustomerService(

            IRepository<Role> roleRepository,

            IStaticCacheManager staticCacheManager)

        {

            _roleRepository = roleRepository;

            _staticCacheManager = staticCacheManager;

        }

        #endregion

        #region 方法--接口实现--角色

        /// <param name="showHidden">指示是否获取角色实体的所有实例,默认值:false,即只获取处于激活状态的角色实体的所有实例。</param>

        /// <summary>

        /// 【异步获取所有角色】

        /// <remarks>

        /// 摘要:

        ///     直接从角色表中1个指定实体的所有实例;或从分布式缓存数据库获取角色实体的所有实例。

        /// </remarks>

        /// <returns>

        ///    列表实例,该实例存储着角色实体的所有实例。

        /// </returns>

        /// </summary>

        public virtual async Task<IList<Role>> GetAllCustomerRolesAsync(bool showHidden = false)

        {

            var key = _staticCacheManager.PrepareKeyForDefaultCache(CustomerServicesDefaults.RolesAllCacheKey, showHidden);

            var query = from role in _roleRepository.Table

                        orderby role.Id

                        where showHidden || role.Active

                        select role;

            var roles = await _staticCacheManager.GetAsync(key, async () => await query.ToListAsync());

            return roles;

        }

        /// <param name="roleId">角色实体1个指定实例的长整型编号值。</param>

        /// <summary>

        /// 【异步通过编号值获取角色】

        /// <remarks>

        /// 摘要:

        ///     直接从角色表中获取1个指定的角色实例;或从分布式缓存数据库获取1个指定用户的所有实例。

        /// </remarks>

        /// <returns>

        ///    1个指定的角色实例。

        /// </returns>

        /// </summary>

        public virtual async Task<Role> GetRoleByIdAsync(long roleId)

        {

            return await _roleRepository.GetByIdAsync(roleId, cache => default);

        }

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

        /// <summary>

        /// 【异步插入角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task InsertRoleAsync(Role role)

        {

            await _roleRepository.InsertAsync(role);

        }

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步批量插入角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例批量持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task InsertRoleAsync(IList<Role> roleList)

        {

            await _roleRepository.InsertAsync(roleList);

        }

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

        /// <summary>

        /// 【异步更新角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例持久化更新到角色表中后,并从缓存数据库中移除与角色实体相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task UpdateRoleAsync(Role role)

        {

            await _roleRepository.UpdateAsync(role);

        }

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步批量更新角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例批量持久化更新到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task UpdateRoleAsync(IList<Role> roleList)

        {

            await _roleRepository.UpdateAsync(roleList);

        }

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

        /// <summary>

        /// 【异步物理删除角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1个指定实例从角色表中物理删除后,并从缓存数据库中移除与角色实体相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task DeleteRoleAsync(Role role)

        {

            if (role == null)

                throw new ArgumentNullException(nameof(Role));

            await _roleRepository.DeleteAsync(role);

        }

        /// <param name="roleList">列表实例,该实例存储着角色实体的1/n个指定实例。</param>

        /// <summary>

        /// 【异步物理批量删除角色】

        /// <remarks>

        /// 摘要:

        ///     把角色实体的1/n个指定实例从角色表中物理批量删除后,并从缓存数据库中移除与角色相关的所有缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task DeleteRoleAsync(IList<Role> roleList)

        {

            await _roleRepository.DeleteAsync(roleList);

        }

        #endregion

    }

}

4 Web.Controllers.CacheServiceController

using Core.Domain.Customers;

using Microsoft.AspNetCore.Mvc;

using Services.Customers;

namespace Web.Controllers

{

    public class CacheServiceController : Controller

    {

        private readonly ICustomerService _customerService;

        public CacheServiceController(ICustomerService customerService)

        {

            _customerService = customerService;

        }

        public async Task<IActionResult> Index()

        {

            IList<Role> _roleList = await _customerService.GetAllCustomerRolesAsync(true);

            return View(_roleList);

        }

        public IActionResult Create()

        {

            return View();

        }

        [HttpPost]

        public async Task<IActionResult> Create(Role model)

        {

            model.Active = true;

            await _customerService.InsertRoleAsync(model);

            return RedirectToAction("Index");

        }

        public async Task<IActionResult> Edit(long id)

        {

            Role _role = await _customerService.GetRoleByIdAsync(id);

            return View(_role);

        }

        [HttpPost]

        public async Task<IActionResult> Edit(Role model)

        {

            await _customerService.UpdateRoleAsync(model);

            return RedirectToAction("Index");

        }

        public async Task<IActionResult> Delete(long id)

        {

            Role _role = await _customerService.GetRoleByIdAsync(id);

            await _customerService.DeleteRoleAsync(_role);

            return RedirectToAction("Index");

        }

        public async Task<IActionResult> CreateTen()

        {

            List<Role> _roleList = new List<Role>();

            for (int i = 0; i < 10; i++)

            {

                Role _role = new Role() { Name = "RoleTen", Active = true, Remark = $"Remark_{i}" };

                _roleList.Add(_role);

            }

            await _customerService.InsertRoleAsync(_roleList);

            return RedirectToAction("Index");

        }

        public async Task<IActionResult> EditTen()

        {

            //由于是批量编辑操作,所以“GetAllAsync”方法不用包含“cache => default”参数实例。

            IList<Role> _roleList = (await _customerService.GetAllCustomerRolesAsync(true)).Where(role => role.Name.Equals("RoleTen")).ToList();

            for (int i = 0; i < _roleList.Count; i++)

            {

                _roleList[i].Remark += "_Edit";

            }

            await _customerService.UpdateRoleAsync(_roleList);

            return RedirectToAction("Index");

        }

        public async Task<IActionResult> DeleteTen()

        {

            //由于是批量删除操作,所以“GetAllAsync”方法不用包含“cache => default”参数实例。

            IList<Role> _roleList = (await _customerService.GetAllCustomerRolesAsync(true)).Where(role => role.Name.Equals("RoleTen")).ToList();

            await _customerService.DeleteRoleAsync(_roleList);

            return RedirectToAction("Index");

        }

    }

}

对以上功能更为具体实现和注释见230512_013ShopRazor(CacheService角色实体的CURD操作示例)。


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

相关文章

C++初始化列表

1.初始化列表概述 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 2.为什么使用初始化列表 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c…

探索数字化转型新道路!流辰信息微服务与您一起创未来!

科技在进步&#xff0c;社会在发展&#xff0c;办公自动化也在高速发展中。数字化转型是当下企业获得长久发展的趋势之一&#xff0c;在信息瞬间万变的社会中&#xff0c;谁掌握了核心技术&#xff0c;谁能与时代同步&#xff0c;谁就能开启新的康庄大道&#xff0c;谁就能在转…

【单目标优化算法】孔雀优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

OpenCV-Python图像阈值

目录 简单阈值 自适应阈值 Otsu的二值化 所谓的图像阈值&#xff0c;就是图像二值化&#xff0c;什么是二值化&#xff0c;就是只有0和1&#xff0c;没有其他的。在OpenCV的图像里面&#xff0c;二值化表示图像的像素为0和255&#xff0c;并没有其他的值&#xff0c;它跟灰度…

02. 路由的定义和控制器

学习要点&#xff1a; 1.路由的定义 2.创建控制器 本节课我们来开始进入学习路由模块&#xff0c;然后简单了解控制器的创建。 一&#xff0e;路由的定义 1. 什么是路由&#xff1f;路由就是提供接受 HTTP 请求的路径&#xff0c;并和程序交互的功能&#xff1b; 2. 简单点理解…

多元统计分析-主成分分析的原理与实现

目录 一、什么是主成分分析&#xff1f; 二、主成分分析的原理 三、主成分分析的应用 四、使用sklearn实现主成分分析 五、总结 一、什么是主成分分析&#xff1f; 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的多元统计分…

css布局——flex布局知识点总结(青蛙游戏)

文章目录 学习网址推荐align-items、justify-content合并使用左右分布和垂直end flex-directionrowrow-reversecolumncolumn-reserse横向逆转并水平start垂直列并从末尾排列逆向垂直列并左右排列水平居中&#xff0c;垂直end&#xff0c;横向逆向 order、align-selforder改变排…

Group相关问题-组内节点限制移动范围

1.在节点中定义dragComputation,限制节点的移动范围 注意事项 组节点不定义go.Placeholder ,设置了占位符后组内节点移动将改变组节点位置dragComputation中自定义stayInGroup计算规则是根据groupNode的resizeObject计算 如果开启了resizable:true,建议指定其改变大的零部件r…