ASP.NET MVC中如何将Action方法拆分至独立DAL与BLL?
拆分方案:将GetLogs Action拆分为数据访问层(DAL)与业务逻辑层(BLL)
我们按照关注点分离的原则,把原Action中的代码拆分到三个独立部分:实体类、DAL、BLL,最后重构Controller。
1. 定义实体类
先把数据模型单独抽离,命名更贴合业务场景:
public class AccessLog { public int LogActivityId { get; set; } public string LogActivityName { get; set; } public string LogActivityDesc { get; set; } }
2. 数据访问层(DAL)
专门负责数据库连接、执行存储过程和数据读取,原Action中的数据库操作逻辑全部移到这里:
public class AccessLogDAL { public List<AccessLog> GetAllLogs() { string connectionString = ConfigurationManager.ConnectionStrings["DbConnString"].ConnectionString; var logs = new List<AccessLog>(); using var connection = new MySqlConnection(connectionString); using var command = new MySqlCommand("Get_AccessLog", connection) { CommandType = CommandType.StoredProcedure }; connection.Open(); using var reader = command.ExecuteReader(); while (reader.Read()) { logs.Add(new AccessLog() { LogActivityId = reader.GetInt32(0), LogActivityName = reader.GetString(1), LogActivityDesc = reader.GetString(2) }); } return logs; } }
3. 业务逻辑层(BLL)
作为Controller和DAL的中间层,负责封装业务规则(当前示例业务逻辑简单,仅做DAL调用封装,后续可扩展权限校验、数据过滤等逻辑):
public class AccessLogBLL { private readonly AccessLogDAL _accessLogDAL; public AccessLogBLL() { _accessLogDAL = new AccessLogDAL(); } public List<AccessLog> GetAccessLogs() { // 此处可添加业务逻辑,比如: // if (!UserHasPermission()) throw new UnauthorizedAccessException(); return _accessLogDAL.GetAllLogs(); } }
4. 重构后的Controller Action
现在Controller只需要处理请求响应,不再关心数据库细节:
public ActionResult GetLogs() { var accessLogBLL = new AccessLogBLL(); var logs = accessLogBLL.GetAccessLogs(); return View("GetLogs", logs); }
拆分的核心优势
- 关注点分离:Controller专注请求响应,DAL专注数据库操作,BLL专注业务规则
- 可维护性:修改数据库连接、存储过程只需改动DAL,业务逻辑变更不影响数据访问层
- 可测试性:DAL和BLL可以单独编写单元测试,无需依赖Controller或视图
内容的提问来源于stack exchange,提问作者Rajnikant
相关产品推荐
相关产品推荐

