You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类库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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:30:57