如何在类库cCoreDb中调用主项目的触发方法?
基于现有ASP.NET架构实现cCoreDb的前后置触发器方案
1. 在类库项目中定义触发器接口
在类库的cCoreDb所在命名空间下,定义统一的触发器接口,包含所需的前后置方法,参数可根据业务实体调整:
public interface ICoreDbTrigger { // 返回bool用于控制是否继续执行操作,也可改为void按需调整 bool BeforeInsert(object entity); void AfterInsert(object entity); bool BeforeUpdate(object originalEntity, object updatedEntity); void AfterUpdate(object originalEntity, object updatedEntity); bool BeforeDelete(object entity); void AfterDelete(object entity); }
2. 修改类库中的cCoreDb类,添加触发器调用逻辑
在cCoreDb类中添加静态触发器实例属性,然后在增删改方法中嵌入触发器调用逻辑:
public class cCoreDb { // 供主项目赋值的静态触发器实例 public static ICoreDbTrigger TriggerInstance { get; set; } public void Insert(object entity) { // 调用前置触发器,返回false则终止操作 if (TriggerInstance != null && !TriggerInstance.BeforeInsert(entity)) { return; // 或抛出业务异常,按需处理 } // 原有数据库插入逻辑 // ... // 调用后置触发器 TriggerInstance?.AfterInsert(entity); } public void Update(object originalEntity, object updatedEntity) { if (TriggerInstance != null && !TriggerInstance.BeforeUpdate(originalEntity, updatedEntity)) { return; } // 原有数据库更新逻辑 // ... TriggerInstance?.AfterUpdate(originalEntity, updatedEntity); } public void Delete(object entity) { if (TriggerInstance != null && !TriggerInstance.BeforeDelete(entity)) { return; } // 原有数据库删除逻辑 // ... TriggerInstance?.AfterDelete(entity); } }
3. 在主项目中实现触发器类
在主项目的App_Code目录或单独类文件中,创建cCoreDbTrigger类实现ICoreDbTrigger接口,编写具体前后置逻辑:
public class cCoreDbTrigger : ICoreDbTrigger { public bool BeforeInsert(object entity) { // 插入前逻辑:数据校验、操作日志、权限验证等 System.Diagnostics.Debug.WriteLine($"准备插入实体:{entity.GetType().Name}"); return true; // 返回true允许执行插入 } public void AfterInsert(object entity) { // 插入后逻辑:更新缓存、发送通知、同步关联数据等 System.Diagnostics.Debug.WriteLine($"已完成实体插入:{entity.GetType().Name}"); } public bool BeforeUpdate(object originalEntity, object updatedEntity) { // 更新前逻辑:字段对比、修改权限校验等 System.Diagnostics.Debug.WriteLine($"准备更新实体:{originalEntity.GetType().Name}"); return true; } public void AfterUpdate(object originalEntity, object updatedEntity) { // 更新后逻辑:清除缓存、记录变更日志等 System.Diagnostics.Debug.WriteLine($"已完成实体更新:{originalEntity.GetType().Name}"); } public bool BeforeDelete(object entity) { // 删除前逻辑:关联数据检查、删除权限校验等 System.Diagnostics.Debug.WriteLine($"准备删除实体:{entity.GetType().Name}"); return true; } public void AfterDelete(object entity) { // 删除后逻辑:清理缓存、归档数据等 System.Diagnostics.Debug.WriteLine($"已完成实体删除:{entity.GetType().Name}"); } }
4. 在主项目的Global.asax中注册触发器
在Global.asax的Application_Start方法中初始化触发器实例,确保应用启动时触发器生效:
void Application_Start(object sender, EventArgs e) { // 注册数据库操作触发器 cCoreDb.TriggerInstance = new cCoreDbTrigger(); // 其他应用启动逻辑... }
额外说明
- 若
cCoreDb是实例化使用而非静态类,可将TriggerInstance改为实例属性,在主项目创建cCoreDb实例时注入触发器对象。 - 如需支持多租户或请求级别的触发器逻辑差异,可将触发器实例存储在
HttpContext.Current.Items中,在每个请求开始时初始化。 - 可根据业务需求调整触发器方法的返回值或异常处理逻辑,避免触发器异常影响核心数据库操作。
内容的提问来源于stack exchange,提问作者undefined behavior
相关产品推荐
相关产品推荐

