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操作示例)。