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

时间:2011-11-24 11:13:36

标签: asp.net data-access-layer code-organization

我有一个用C#开发的ASP.NET Web窗体应用程序。

我想通过将DAL任务与后面的代码分开来为我的应用程序提供结构。

我在App_Code中创建了一个类, DBUtilities 负责与数据库的通信,以便在整个应用程序中不会有重复的代码。该类具有获取数据表,标量值等的方法......并且它们接受连接字符串名称查询命令作为参数作为字符串。

问题是我的代码中仍然存在所有查询命令。它们中的许多都在页面周围重复,这导致了维护问题。

我想知道创建包含许多字符串属性的(静态)类 QueryRepository 是否是一个好习惯,并将每个属性与特定查询命令相关联。每次我想执行查询命令 MyCommand 时,我都会向 DBUtilities 类传递字符串的QueryRepository.MyCommand属性。 Morevoer如果我需要更改查询命令,我只在QueryRepository类上执行。

这是组织我的DAL的好方法吗?

4 个答案:

答案 0 :(得分:3)

对于ASP.NET Web表单,实现Model-View-Presenter(MVP)模式可以是将逻辑和数据库查询与后面的UI代码分开的一种好方法。您必须编写一个Presenter类,该类具有对视图接口的通用引用,并且其中包含具有数据库查询,逻辑等的模型。演示者将在其所有函数中调用泛型视图接口的函数。然后你可以编写实际的ASP.net视图。在视图中,您实例化并引用此演示者,并在实例化演示者时注入自身对象,即ASP视图本身(使用"此"关键字)到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 webforms的MVP模式将在一定程度上解决代码分离问题。最好的选择是使用ASP.net MVC,如果没有,那么你可以将MVP用于Webforms。

答案 1 :(得分:2)

长期回答:我真的建议您阅读Professional Enterprise .NET

ASP.NET网站有一个值得关注的repository pattern的好例子。

我不是专家,但如果您的DAL能够符合最佳实践模式,那么它更有可能成为组织的好方法。

我很难在没有具体例子的情况下遵循你的DAL设计,所以不确定我能在那里提供帮助。

答案 2 :(得分:1)

接下来几步:

优良作法是将DAL,BLL代码与演示文稿(UI)层分开,但是相应地下面的步骤会有所帮助。

  1. 创建DTO(数据传输对象)或实体
  2. 从表示层填写DTO /实体
  3. 将其传递给BLL图层的公共方法并验证业务逻辑
  4. 然后将DTO / Entity传递给DAL层(在DAL层,创建一个返回Command的方法,然后将您的CommandText,CommandType然后将Set值,数据类型和大小放到所有参数中,同时创建获取的execute方法命令和返回结果)。
  5. 最后,执行您想要的执行方法(在DAL层创建)

答案 3 :(得分: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();
        }
    }
}