DAL 是否应始终在 MVP 中返回业务对象
本文关键字:返回 业务 对象 MVP 是否 DAL | 更新日期: 2023-09-27 18:06:08
-
在模型视图表示器(
MVP
(模式中,据说我们的DAL
总是应该返回业务模型。但是,假设我只想从数据库中获取一个数字,例如最后一个字符串ClientID
(最新的客户端 ID(,我的DAL
方法是否应该返回一个具有大约 10 个其他字段的ClientInfo
对象,如ClientName
、Address
等? -
如果我想从我的
DAL
中获取业务对象列表,是否可以接受如下操作,或者更好地从DAL
获取DataTable
,然后在应用程序BLL
中,将其转换为List
?public List<Employee> GetNewEmployees() { string selectStatement = "SELECT Employee.Emp_ID, Employee.Initials + ' ' + Employee.Surname AS Name,..."; using (SqlConnection sqlConnection = new SqlConnection(db.GetConnectionString)) { using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection)) { sqlConnection.Open(); using (SqlDataReader dataReader = sqlCommand.ExecuteReader()) { List<Employee> list = new List<Employee>(); while (dataReader.Read()) { list.Add ( new EpfEtfMaster { EmployeeID = (int) dataReader ["emp_id"], EmployeeName = (string) dataReader ["Name"], AppointmentDate = (DateTime) dataReader["appointment_date"], }); } return list; } } } }
这是一个有点基于意见的问题,但请继续回答,因为我认为它很重要。
-
如果您对数据库有多个访问权限只是为了查询您的
ClientID
,那么不分配整个ClientInfo
对象是有效的,因为它是多余的,当您只需要一个int/string
时,不需要整个额外的分配。虽然如果你确实看到自己开始添加超过 1 个属性(假设你需要获得一个ClientID
和一个Address
(,那么你应该将你的返回值转换为一个ClientInfo
。这真的取决于场景。 -
同样,这是MO。我会让我的数据库返回一个
DataTable
,因为我不希望我的Data Access Layer
与我的Data Object Model
有任何关系。如果有一天我想改变它,我不希望它成为一个横切的问题并重构程序的每个部分。相反,我会让一个中级班负责将DataTable
转换为我的DOM
。这样,只有一个地方知道已经进行了更改,我只需要重构代码中的一个地方。我强烈建议将AutoMapper作为应用程序的中间层。