Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DAL是否应始终在MVP中返回业务对象_C#_.net_Oop_Ado.net_Mvp - Fatal编程技术网

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

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

在Model-View-Presenter(
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
    。这取决于具体情况

  • 同样,这是MO。我希望我的DB返回一个
    数据表
    ,因为我不希望我的
    数据访问层
    与我的
    数据对象模型
    有任何关系。如果有一天我想改变它,我不希望它成为一个交叉关注点,重构程序的每一部分。相反,我会让一个中间类负责将
    DataTable
    转换为我的
    DOM
    。这样,只有一个地方需要知道已经进行了更改,我只需要重构代码中的一个地方。我强烈建议将其作为应用程序的中间层


  • 我想说,
    DataTable
    BusinessObject
    的转换是DAL的一个实现细节。它绝对不是数据对象模型的一部分(或业务层,或域层,或任何你称之为它的东西)。这是一个哲学论点:),但我相信DAL应该知道访问它必须访问的特定数据源,而不是更多。虽然如果您使用
    AutoMapper
    来抽象DB对象到DOM的转换,那么在DAL中这样做可能没问题,因为您没有强迫它知道DOM是如何构建的。