2011-11-24 52 views
3

我有用C#开发的ASP.NET Web窗体应用程序。如何在ASP.NET中组织数据访问层(DAL)

我想通过给结构我的应用从后面的代码分离DAL任务。

我创建了一个App_Code文件类,是需要照顾的沟通与数据库中,为了不重复的代码都沿着应用DBUtilities。该类的方法来获得数据表,标值,等等......他们接受作为参数连接字符串名称和字符串查询命令

问题是,我仍然在我的代码背后的所有查询的命令。它们中的许多都在页面中重复,这造成了维护问题。

我想知道,如果它是一个很好的做法,建立一个(静态)类QueryRepository包含许多字符串属性和准他们每个人特定的查询命令。每次我要执行的查询命令mycommand的我传递给DBUtilitiesQueryRepository.MyCommand财产instaed的字符串。更多如果我需要更改查询命令我只是在QueryRepository类上执行它。

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

回答

2

长期的回答:我真的可以推荐你读Professional Enterprise .NET

的ASP.NET网站有repository pattern这是值得看的一个很好的例子。

我不是专家,但如果你的DAL可以符合最佳实践模式它更可能是为它举办一个好办法。

我挣扎按照你的DAL的设计没有一个具体的例子,所以不知道我能帮助那里。

+0

感谢但你的链路是指MVC框架。我使用的ASP.NET Web窗体 – CiccioMiami

+0

我认为链接提供了一个很好的描述,没有链接到mvc的存储库模式。 +1 – faester

3

为了实现模型 - 视图 - 演示者(MVP)模式的ASP.NET Web形式可以是一个很好的方法,从UI代码后面分开你的逻辑和数据库查询。你必须编写一个Presenter类,该类有一个对视图接口的通用引用,并且有一个包含数据库查询,逻辑等的模型。演示者将在其所有函数中调用通用视图接口的函数。然后你可以编写实际的ASP.net视图。在视图中,您实例化并引用此演示者,并在实例化演示者时将自身对象(即,ASP视图本身(使用“this”关键字)注入演示者)。您可以根据您的需要为您的演示者类设计适当的继承,以便它们可以重用并可以进行单元测试。

加成响应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。

+0

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

+0

嗨我编辑了上述帖子。 –

1

几个步骤如下:

这是很好的做法,在DAL,从表现(UI)层BLL代码中分离出来,但相应地去下面的步骤将是有益的。

  1. 创建DTO(数据传输对象)或实体
  2. 从表现层填充DTO /实体
  3. 它传递给公众的方法来你的BLL层和验证业务逻辑
  4. 然后通过DTO /实体到DAL层(在DAL层,创建一个返回Command的方法,然后把你的CommandText,CommandType,然后设置值,数据类型和大小到所有参数,还创建执行方法,获取命令并返回结果)。
  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(); 
     } 
    } 
} 
+0

for bll请参阅http://stackoverflow.com/questions/1759152/business-logic-layer – sanchita