C# DAL是否应始终在MVP中返回业务对象
在Model-View-Presenter(C# DAL是否应始终在MVP中返回业务对象,c#,.net,oop,ado.net,mvp,C#,.net,Oop,Ado.net,Mvp,在Model-View-Presenter(MVP)模式中,据说我们的DAL总是应该返回业务模型。但假设我只想从数据库中获取一个数字,比如最后一个ClientID(最新的客户端ID),它是一个字符串,那么我的DAL方法是否应该返回一个ClientInfo对象,该对象包含大约10个其他字段,如ClientName,Address等 如果我想从我的DAL中获取业务对象列表,可以按照以下方式进行,还是最好从DAL中获取DataTable,然后在应用程序BLL中将其转换为列表 public List&l
MVP
)模式中,据说我们的DAL
总是应该返回业务模型。但假设我只想从数据库中获取一个数字,比如最后一个ClientID
(最新的客户端ID),它是一个字符串,那么我的DAL
方法是否应该返回一个ClientInfo
对象,该对象包含大约10个其他字段,如ClientName
,Address
等
DAL
中获取业务对象列表,可以按照以下方式进行,还是最好从DAL
中获取DataTable
,然后在应用程序BLL
中将其转换为列表
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;
}
}
}
}
public List GetNewEmployees()
{
string selectStatement=“选择Employee.Emp_ID,Employee.Initials+“”+Employee.Name作为姓名,…”;
使用(SqlConnection SqlConnection=newsqlconnection(db.GetConnectionString))
{
使用(SqlCommand SqlCommand=newsqlcommand(selectStatement,sqlConnection))
{
sqlConnection.Open();
使用(SqlDataReader=sqlCommand.ExecuteReader())
{
列表=新列表();
while(dataReader.Read())
{
列表。添加(
新的EpfEtfMaster{
EmployeeID=(int)数据读取器[“emp_id”],
EmployeeName=(字符串)数据读取器[“名称”],
任命日期=(日期时间)数据读取器[“任命日期”],
});
}
退货清单;
}
}
}
}
这是一个基于观点的问题,但我会继续回答,因为我认为这很重要
ClientID
而多次访问数据库,则不分配整个ClientInfo
对象是有效的,因为它是冗余的,并且当您只需要int/string
时,不需要整个额外分配。虽然如果您确实看到自己开始添加多个属性(假设您需要获得ClientID
和地址
),但您应该将返回值转换为ClientInfo
。这取决于具体情况数据表
,因为我不希望我的数据访问层
与我的数据对象模型
有任何关系。如果有一天我想改变它,我不希望它成为一个交叉关注点,重构程序的每一部分。相反,我会让一个中间类负责将DataTable
转换为我的DOM
。这样,只有一个地方需要知道已经进行了更改,我只需要重构代码中的一个地方。我强烈建议将其作为应用程序的中间层我想说,
DataTable
到BusinessObject
的转换是DAL的一个实现细节。它绝对不是数据对象模型的一部分(或业务层,或域层,或任何你称之为它的东西)。这是一个哲学论点:),但我相信DAL应该知道访问它必须访问的特定数据源,而不是更多。虽然如果您使用AutoMapper
来抽象DB对象到DOM的转换,那么在DAL中这样做可能没问题,因为您没有强迫它知道DOM是如何构建的。