DAL 是否应始终在 MVP 中返回业务对象

本文关键字:返回 业务 对象 MVP 是否 DAL | 更新日期: 2023-09-27 18:06:08

  1. 在模型视图表示器(MVP(模式中,据说我们的DAL总是应该返回业务模型。但是,假设我只想从数据库中获取一个数字,例如最后一个字符串ClientID(最新的客户端 ID(,我的 DAL 方法是否应该返回一个具有大约 10 个其他字段的 ClientInfo 对象,如 ClientNameAddress 等?

  2. 如果我想从我的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;
                }
            }
        }
    }
    

DAL 是否应始终在 MVP 中返回业务对象

这是一个有点基于意见的问题,但请继续回答,因为我认为它很重要。

  1. 如果您对数据库有多个访问权限只是为了查询您的ClientID,那么不分配整个ClientInfo对象是有效的,因为它是多余的,当您只需要一个int/string时,不需要整个额外的分配。虽然如果你确实看到自己开始添加超过 1 个属性(假设你需要获得一个ClientID和一个Address(,那么你应该将你的返回值转换为一个ClientInfo。这真的取决于场景。

  2. 同样,这是MO。我会让我的数据库返回一个DataTable,因为我不希望我的Data Access Layer与我的Data Object Model有任何关系。如果有一天我想改变它,我不希望它成为一个横切的问题并重构程序的每个部分。相反,我会让一个中级班负责将DataTable转换为我的DOM。这样,只有一个地方知道已经进行了更改,我只需要重构代码中的一个地方。我强烈建议将AutoMapper作为应用程序的中间层。