個人感覺資料訪問層,設計上應該可以更精簡。
現有的架構是一個DAL,對應一個Helper(我們可以理解其實就是真正的資料引擎)。這種方式實現上確實很簡單,但是有重複的地方。對於每種DAL,不同的只是Helper,其它實現基本相同。
一個可行的重構,實現一個真正的Helper類,把不同的資料引擎,封裝為一個DALEngine, 一些簡單的代碼實現,可以參見如下:
public interface IDALEngine
{
int ExecuteNonQuery(CommandType cmdType, String cmdText, IList<IParameter> parameters);
object ExecuteNonScalar(CommandType cmdType, String cmdText, IList<IParameter> parameters);
IDataReader ExecuteReader(CommandType cmdType, String cmdText, IList<IParameter> parameters);
}
public abstract class DALHelper
{
public static int ExecuteNonQuery(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
return engine.ExecuteNonQuery(cmdType, cmdText, parameters);
}
public static object ExecuteNonScalar(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
return engine.ExecuteNonScalar(cmdType, cmdText, parameters);
}
public static IDataReader ExecuteReader(IDALEngine engine, CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
return engine.ExecuteReader(cmdType, cmdText, parameters);
}
}
public class SqlDALEngine : IDALEngine
{
private SqlConnection conn;
public SqlDALEngine(String connString)
{
conn = new SqlConnection(connString);
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
}
int ExecuteNonQuery(CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
if (conn.State != ConnectionState.Open)
{
//throw exception: connection is closed!
}
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = cmdType;
cmd.CommandText = cmdText;
if (parameters != NULL)
{
foreach (IParameter param in parameters)
{
cmd.Parameters.Add(param); //也許需要進行一些轉換,這裡只是一個虛擬碼
}
}
int result = cmd.ExecuteNonQuery();
return result;
}
object ExecuteNonScalar(CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
//參考實現如ExecuteNonQuery
}
IDataReader ExecuteReader(CommandType cmdType, String cmdText, IList<IParameter> parameters)
{
//參考實現如ExecuteNonQuery
}
}
看起來這隻是一個簡單的轉換,但在大型系統,表格極多的情況下,絕對是一大改善。
另外,原有的資料訪問層架構,如果在資料沒有準備好的情況下,不便於測試,通過這種改善,我們可以把資料訪問及資料訪問引擎給進行隔離,各自發展