C#中BaseDAL子类继承优化:移除存储过程名变量传递方案
解决方案
核心思路是为每个数据库操作定义专属的抽象存储过程名称属性,让子类实现这些属性来提供对应操作的存储过程名,替代原来的可变实例变量zProceduceName,避免多方法调用时的变量覆盖问题,同时让代码逻辑更清晰。
修改后的BaseDAL代码
// 定义每个操作对应的抽象存储过程名称属性,子类必须实现 protected abstract string LoadProcedureName { get; } protected abstract string InsertProcedureName { get; } protected abstract string UpdateProcedureName { get; } protected abstract string DeleteProcedureName { get; } public virtual async Task<DataTable> loadDataAsync() { return await DataProvider.Instance.executeQueryAsync(LoadProcedureName); } public virtual async Task insertAsync(string pzName, string pzAddress, string pzEmail, string pzPhone, CancellationToken pCt) { await DataProvider.Instance.executeNonQueryAsync(InsertProcedureName, pCt, new object[] { pzName, pzAddress, pzEmail, pzPhone }); } public virtual async Task updateAsync(int pnID, string pzName, string pzAddress, string pzEmail, string pzPhone, CancellationToken pCt) { await DataProvider.Instance.executeNonQueryAsync(UpdateProcedureName, pCt, new object[] { pnID, pzName, pzAddress, pzEmail, pzPhone }); } public virtual async Task deleteAsync(int pnID, CancellationToken pCt) { await DataProvider.Instance.executeNonQueryAsync(DeleteProcedureName, pCt, new object[] { pnID }); }
修改后的AuthorDAL代码
// 直接实现父类的抽象属性,提供每个操作对应的存储过程名 protected override string LoadProcedureName => "dbo.LoadAuthor"; protected override string InsertProcedureName => "dbo.InsertAuthor @name , @address , @email , @phone"; protected override string UpdateProcedureName => "dbo.UpdateAuthor @id , @name , @address , @email , @phone"; protected override string DeleteProcedureName => "dbo.DeleteAuthor @id"; // 补充对应删除操作的存储过程名 // 无需重写父类方法,直接复用父类逻辑即可 // 若有特殊业务逻辑,再针对性重写对应方法
改动优势
- 解决线程安全问题:原
zProceduceName是实例变量,多线程同时调用不同方法时会被覆盖,导致存储过程名错误。现在每个操作使用独立的只读属性,不存在变量覆盖风险。 - 简化代码维护:子类只需一次性定义所有操作的存储过程名,无需在每个方法里重复设置变量,也删除了原代码中冗余的重复执行逻辑。
- 逻辑更直观:每个操作对应的存储过程名一目了然,后续修改或扩展更便捷。
内容的提问来源于stack exchange,提问作者QuangGiap
相关产品推荐
相关产品推荐

