TableResolver的初步介绍
在入门篇里介绍的各项功能,都只需要配置XML就可以实现,非常的方便。然而,实际项目中情况会更加的灵活多变,仅仅通过配置是没法覆盖的。从初级篇开始会陆续介绍在XML配置的基础上如何通过插件的方式扩展或修改以前的配置。
常规的Tk5TableResolver插件示例
这里假设你已经了解添加插件模块的方法,如你不清楚的话,请点击 怎么添加插件模块 。
这里以代理商管理功能为例:
-
在插件工程里添加AgentResolver类,代码如下
using System; using System.Data; using YJC.Toolkit.Data; using YJC.Toolkit.Sys; namespace TK55.Agent { [Resolver(Author = "XXX", CreateDate = "2020-06-15", Description = "销售商表的数据访问层类")] public class AgentResolver : Tk5TableResolver { internal const string DATAXML = "Agent/Agent.xml"; /// <summary> /// 建构函数,设置附着的Xml文件。 /// </summary> /// <param name="context">数据库连接上下文</param> /// <param name="source">附着的数据源</param> public AgentResolver(IDbDataSource source) : base(DATAXML, source) { AutoUpdateKey = false; AutoTrackField = true; } /// <summary> /// 在表发生新建、修改和删除的时候触动。注意,千万不要删除base.OnUpdatingRow(e); /// UpdatingRow事件附着在基类该函数中。 /// </summary> /// <param name="e">事件参数</param> protected override void OnUpdatingRow(UpdatingEventArgs e) { base.OnUpdatingRow(e); switch (e.Status) { case UpdateKind.Insert: break; case UpdateKind.Update: break; case UpdateKind.Delete: break; } } } }
注意:需要在类名AgentResolver上标注ResolverAttribute。只有这样,插件才会注册。如果没在ResolverAttribute中显示指定注册名,那么系统自动将类名去掉Resolver的后缀,来获取注册名。以上面的代码为例,注册名为Agent。
-
在Module的Xml里配置访问AgentResolver类,配置如下:
<tk:Module> <tk:Title> <tk:Content>销售商管理</tk:Content> </tk:Title> <tk:MetaData> <tk:SingleXmlMetaData DataXml="Agent/Agent.xml" ColumnCount="1"/> </tk:MetaData> <tk:Source> <tk:SingleDbSource DisablePage="Delete" PageSize="15" OrderBy="order by if_show desc,update_date desc"> <tk:Resolver> <tk:RegResolver>Agent</tk:RegResolver> </tk:Resolver> </tk:SingleDbSource> </tk:Source> <tk:PageMaker> <tk:RazorModuleTemplatePageMaker ModuleTemplate="Single" /> </tk:PageMaker> </tk:Module>
以上配置、页面上的增删改查等数据操作就会调用AgentResolver类。下面对Tk5TableResolver类常用的属性和方法进行讲解。
Tk5TableResolver常用属性和方法
-
AutoUpdateKey
新增时是否自动生成主键。设置为true时,框架会根据不同的数据库,自动产生一个唯一的Id给对应的主键。
-
AutoTrackField
是否自动设置追踪字段的值。设置为true时,框架会根据当前登录用户和系统时间以及新建还是修改更新以下四个字段,这四个字段的昵称必须是:CreateDate、CreateId、UpdateDate、UpdateId,请注意这四个字段的昵称是大小写敏感的。
-
OnUpdatingRow(UpdatingEventArgs e)
在表的每条记录发生新建、修改和删除的时候触动(注意这是记录级的,针对每条记录。如果修改了两条记录,那么这个方法会被触动两次)。你可以在这里根据业务需要,修改其他相关字段的值或者其他表的记录。
譬如:AutoTrackField设置为false,由自己实现相同功能,如下:
/// <summary> /// 在表发生新建、修改和删除的时候触动。注意,千万不要删除base.OnUpdatingRow(e); /// UpdatingRow事件附着在基类该函数中。 /// </summary> /// <param name="e">事件参数</param> protected override void OnUpdatingRow(UpdatingEventArgs e) { base.OnUpdatingRow(e); switch (e.Status) { case UpdateKind.Insert: e.Row["CreateId"] = e.Row["UpdateId"] = BaseGlobalVariable.UserId; e.Row["CreateDate"] = e.Row["UpdateDate"] = DateTime.Now; break; case UpdateKind.Update: e.Row["UpdateId"] = BaseGlobalVariable.UserId; e.Row["UpdateDate"] = DateTime.Now; break; case UpdateKind.Delete: break; } }
关注微信公众号获取TKCore最新资讯: