.net Core ABP框架中关于仓储IRepository的方法拓展

概要

本次介绍的仓储IRepository的方法拓展,目的是为了让其方法自带操作日志记录的产生。需要记录值变化的操作基本是增、删、改的类型方法。

下面我们就这几个方法进行拓展。

一、 拓展的自定义步骤

1、创建拓展方法类

首先,你需要一个静态类用来包含你的拓展方法(静态)

public static class MkRepository
{
   
	// 你的扩展方法将在这里定义
}

2、定义扩展方法

在 MkRepository类中定义你的扩展方法。

假设你要为 IRepository<TEntity, TKey> 添加一个 MkUpdateAsync方法,该方法记录发生变化的字段值并保存变更日志。

public static class MkRepository
{
   
    public static async Task<bool> MkUpdateAsync<TEntity, TKey>(this IRepository<TEntity, TKey> repository, TEntity entity)
        where TEntity : class, IEntity<TKey>
    {
   
        try
        {
   
            var entityDbContext = repository.GetDbContext();

            var originalEntity = await entityDbContext.FindAsync(typeof(TEntity), entity.Id);
            if (originalEntity == null)
            {
   
                throw new EntityNotFoundException(typeof(TEntity), entity.Id);
            }
            
            // 使用ChangeTracker来检测变更
            entityDbContext.Entry(originalEntity).CurrentValues.SetValues(entity);

            // 这里可以添加逻辑来记录哪些字段发生了变化
            var changedProperties = entityDbContext.ChangeTracker.Entries<TEntity>()
                .SelectMany(e => e.Properties.Where(p => p.IsModified))
                .Where(e => e.CurrentValue != e.OriginalValue)
                .Select(p =>
                {
   
                    var propertyName = p.Metadata.Name;
                    var propertyInfo = typeof(TEntity).GetProperty(propertyName);
                    var displayNameAttr = propertyInfo?.GetCustomAttribute<DisplayAttribute>();
                    var displayName = displayNameAttr?.GetName() ?? propertyName; // 如果没有DisplayAttribute,则使用属性名

                    return $"{
     displayName}{
     FormatValue(p.OriginalValue)}变为{
     FormatValue(p.CurrentValue)};";
                })
                .ToList();


            var result = await entityDbContext.SaveChangesAsync();
            if (result > 0)
            {
   
                var changedPropertiesStr = 
《代码库》1.0 主要功能简介 《代码库》是专为程序员设计的一个源码管理工具。她可以使编程变得更为有趣,降低您的重复劳动;她虽然不能立即提高您的编程技能,但能够让您在开发软件的过程中节省时间与金钱。在现代软件开发过程中,个人英雄式的完成一个从最底层开发的软件是极为困难的,因为您得为您的程序准备一切,但您愿意重写您以前写过的所有子程序吗。而实际上在开发的同时,可以将一些好的代码片断、算法加以摘录,并保存在《代码库》中,可以随时查阅、编辑您所收集的知识,并将能利用的代码加入您的程序中,提高开发速度。 《代码库》是一个基于文本格式的工具,采用树型目录进行的知识分类管理,您可以在她的帮助下清晰、准确的管理您收集的优秀代码。《代码库》使用自身的库数据结构, 并支持库形式的导出、导入,也支持文本文件的导出、导入,支持Windows粘贴板复制(支持TXT、RTF格式)、粘贴,功能丰富的编辑:支持Undo操作、显示行号、调整tab字符数、增加/减少缩进、设置当次缩进的字符数、换行显示,支持语法高亮显示、编辑修改(目前版本支持九种语法标识:Plain Text, Object Pascal, ANSI C, Java, Visual Basic, eMail, IniFile, Html/JS/VBS , PL/SQL),支持功能强大的全库查找和搜索功能,提供打印及打印预览功能。《代码库》是专门为程序员进行设计的,因此我们知道什么是您最需要的,也会最好的东西带给您。 感谢David Brock的控件(TSyntaxMemo v3.00.36)以及Jordan Russell的控件(Toolbar2000 v3.0)。另感谢Wzy兄帮忙进行测试! 另外您可以随意复制、散发本软件,但是不得对本软件作任何修改。作者保留《代码库》的版权。本人将不定期的更新本软件,最新版的《代码库》请到www.csdn.net的共享软件栏目中寻找。 建议运行环境Windows98、Win2000、WinXP,内存64M以上。 如果您在使用中发现有什么bug或有什么建议,请及时通知我iRepository@citiz.net,本人将尽快回复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值