我有一个用C#开发的ASP.NET Web窗体应用程序。
我想通过将DAL任务与后面的代码分开来为我的应用程序提供结构。
我在App_Code中创建了一个类, DBUtilities 负责与数据库的通信,以便在整个应用程序中不会有重复的代码。该类具有获取数据表,标量值等的方法......并且它们接受连接字符串名称和查询命令作为参数作为字符串。
问题是我的代码中仍然存在所有查询命令。它们中的许多都在页面周围重复,这导致了维护问题。
我想知道创建包含许多字符串属性的(静态)类 QueryRepository 是否是一个好习惯,并将每个属性与特定查询命令相关联。每次我想执行查询命令 MyCommand 时,我都会向 DBUtilities 类传递字符串的QueryRepository.MyCommand
属性。 Morevoer如果我需要更改查询命令,我只在QueryRepository类上执行。
这是组织我的DAL的好方法吗?
答案 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)层分开,但是相应地下面的步骤会有所帮助。
答案 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();
}
}
}