如何在ASP.NET中组织数据访问层(DAL)

5
我有一个使用C#开发的ASP.NET Web Forms应用程序。
我想通过将数据访问层与代码分离来为应用程序提供结构。
我在App_Code中创建了一个名为DBUtilities的类,负责与数据库通信,以避免在整个应用程序中重复代码。该类具有获取数据表、标量值等方法,并将连接字符串名称查询命令作为字符串参数。
问题在于,我的代码仍然包含所有查询命令。其中许多在页面周围重复出现,这会导致维护问题。
我想知道是否创建一个(静态)类QueryRepository是一个好的做法,其中包含多个字符串属性,并将每个属性关联到特定的查询命令。每次我想要执行查询命令MyCommand时,我将QueryRepository.MyCommand属性传递给DBUtilities类,而不是传递字符串。此外,如果我需要更改查询命令,我只需在QueryRepository类中进行更改。
这是组织我的数据访问层的好方法吗?
4个回答

4
对于ASP.NET Web Forms来说,实现Model-View-Presenter (MVP)模式可以是将逻辑和数据库查询与UI代码分离的一种好方法。您需要编写一个Presenter类,它具有对视图接口的通用引用,并在其中包含具有数据库查询、逻辑等内容的模型。Presenter将在其所有函数中调用通用视图接口的函数。然后,您可以编写实际的ASP.net视图。在视图中,您实例化并引用此Presenter,同时在实例化Presenter时将自身对象即ASP视图本身(使用“this”关键字)注入到Presenter中。您可以根据自己的需要为Presenter类设计适当的继承,以便它们可重用并可进行单元测试。

针对CiccioMiami的问题的补充:

以下是一些开始的链接

http://www.codeproject.com/KB/aspnet/AspNet_MVP.aspx

http://wiki.asp.net/page.aspx/340/mvp-pattern/

这里解释了MVC和MVP模式的区别:http://www.codeproject.com/KB/architecture/DotNetMVPFramework_Part1.aspx
此外,对于ASP.net Web表单架构,请求与页面生命周期紧密耦合。您有一系列的页面生命周期事件,开发人员在每个事件中编写代码。因此,业务逻辑与UI视图紧密耦合。随着时间的推移,这对于代码可维护性和单元测试来说并不是一个好的情况。在ASP.net Web表单中,单元测试很困难,因为很难模拟请求和页面生命周期事件。在MVC中,请求首先到达控制器。控制器使用模型进行业务逻辑,并将模型传递给视图。视图使用模型数据呈现,并作为响应返回给用户。控制器在工作流程上具有更大的控制权。您可以像在独立应用程序中那样测试模型、DTO传输等。对于Web表单,没有控制器,请求直接到达ASP.net页面,这是一个视图。用户不能做太多事情。很高兴微软意识到了这个问题,我们有了ASP.net MVC。ASP.net Web表单的MVP模式将在一定程度上解决代码分离问题。最好的选择是使用ASP.net MVC,如果不行,您可以在Web表单中使用MVP。

哇,这看起来是一个相当不错的解决方案。你知道有关在ASP.NET中实现MVP的任何教程吗?它与MVC(模式而非框架)有什么区别? - CiccioMiami

2
长期的解决方案:我真的可以推荐您阅读Professional Enterprise .NET
ASP.NET网站有一个很好的repository pattern示例,值得一看。
我不是专家,但如果您的DAL符合最佳实践模式,那么它更有可能成为组织方式的良好选择。
我没有具体示例无法理解您的DAL设计,所以不确定能否提供帮助。

谢谢,但是你的链接是关于MVC框架的。我使用的是ASP.NET Web Forms。 - CiccioMiami
我认为该链接提供了一个很好的关于仓储模式的描述,它与MVC无关。+1 - faester

1

跟随以下几个步骤:

将DAL、BLL代码与演示(UI)层分开是一个好的实践,但是按照以下步骤会很有帮助。

  1. 创建DTO(数据传输对象)或实体
  2. 从演示层填充DTO/实体
  3. 将其传递到BLL层的公共方法并验证业务逻辑
  4. 然后将DTO/实体传递到DAL层(在DAL层中,创建一个返回Command的方法,然后放置CommandText、CommandType以及对所有参数设置值、数据类型和大小,还要创建执行方法,该方法获取Command并返回结果)。
  5. 最后,执行您所需的执行方法(在DAL层创建)

0
namespace DAL
{
    public class DBAccess
    {
        private IDbCommand cmd = new SqlCommand();
        private string strConnectionString = "";
        private bool handleErrors = false;
        private string strLastError = "";
        public DBAccess()
        {
            ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["connectionString"];
            strConnectionString = objConnectionStringSettings.ConnectionString;
            SqlConnection cnn = new SqlConnection();
            cnn.ConnectionString = strConnectionString;
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.StoredProcedure;
        }

        public SqlConnection OpenSqlConnection()
        {
            try {
                SqlConnection Conn = new SqlConnection(strConnectionString);
                Conn.Open();
                return Conn;
            } catch (SqlException e) {
                throw e;
            } catch (Exception ex) {
                throw ex;
            }
        }

        public IDataReader ExecuteReader()
        {
            IDataReader reader = null;
            try {
                this.Open();
                reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            } catch (Exception ex) {
                if (handleErrors) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return reader;
        }

        public IDataReader ExecuteReader(string commandtext)
        {
            IDataReader reader = null;
            try {
                cmd.CommandText = commandtext;
                reader = this.ExecuteReader();
            } catch (Exception ex) {
                if ((handleErrors)) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return reader;
        }
        public object ExecuteScalar()
        {
            object obj = null;
            try {
                this.Open();
                obj = cmd.ExecuteScalar();
                this.Close();
            } catch (Exception ex) {
                if (handleErrors) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return obj;
        }
        public object ExecuteScalar(string commandtext)
        {
            object obj = null;
            try {
                cmd.CommandText = commandtext;
                obj = this.ExecuteScalar();
            } catch (Exception ex) {
                if ((handleErrors)) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return obj;
        }
        public int ExecuteNonQuery(SqlConnection DBConnection, SqlTransaction DBTransaction, bool IsTransRequired)
        {
            int i = -1;

            try {
                if ((DBTransaction != null)) {
                    cmd.Transaction = DBTransaction;
                }
                i = cmd.ExecuteNonQuery();

            } catch (Exception ex) {
                if (handleErrors) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return i;
        }
        public int ExecuteNonQuery(string commandtext, bool IsTransRequired)
        {
            SqlConnection DBConnection = null;
            SqlTransaction DBTransaction = null;
            int i = -1;
            try {
                cmd.CommandText = commandtext;
                if (((DBConnection == null))) {
                    this.Open();
                    DBConnection = (SqlConnection)this.cmd.Connection;
                    if (IsTransRequired == true) {
                        if (((DBTransaction == null))) {
                            DBTransaction = DBConnection.BeginTransaction();
                        }
                    }
                    i = this.ExecuteNonQuery(DBConnection, DBTransaction, IsTransRequired);
                    if ((DBTransaction != null)) {
                        DBTransaction.Commit();
                    }
                }

            } catch (Exception ex) {
                if ((DBTransaction != null)) {
                    DBTransaction.Rollback();
                }
                if (handleErrors) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            } finally {
                this.Close();
            }
            return i;
        }
        public DataSet ExecuteDataSet()
        {
            SqlDataAdapter da = null;
            DataSet ds = null;
            try {
                da = new SqlDataAdapter();
                da.SelectCommand = (SqlCommand)cmd;
                ds = new DataSet();
                da.Fill(ds);
            } catch (Exception ex) {
                if ((handleErrors)) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return ds;
        }
        public DataSet ExecuteDataSet(string commandtext)
        {
            DataSet ds = null;
            try {
                cmd.CommandText = commandtext;
                ds = this.ExecuteDataSet();
            } catch (Exception ex) {
                if (handleErrors) {
                    strLastError = ex.Message;
                } else {
                    throw;
                }
            }
            return ds;
        }
        public string CommandText{
            get {
                return cmd.CommandText;
            }
            set {
                cmd.CommandText = value;
                cmd.Parameters.Clear();
            }
        }

        public IDataParameterCollection Parameters{
            get {return cmd.Parameters;}
        }
        public void AddParameter(string paramname, object paramvalue)
        {
            SqlParameter param = new SqlParameter(paramname, paramvalue);
            cmd.Parameters.Add(param);
        }

        public void AddParameter(IDataParameter param)
        {
            cmd.Parameters.Add(param);
        }
        public string ConnectionString {
            get { return strConnectionString; }
            set { strConnectionString = value; }
        }
        private void Open()
        {
            cmd.Connection.Open();
        }

        private void Close()
        {
            cmd.Connection.Close();
        }
        public bool HandleExceptions{
            get {return handleErrors;}
            set {handleErrors = value;}
        }
        public string LastError{
            get {return strLastError;}
        }
        public void Dispose()
        {
            cmd.Dispose();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接