在學(xué)習(xí)程序設(shè)計的時候,我們都會用到多層架構(gòu),其帶來的好處是不要重復(fù)地寫代碼,可能通過面向?qū)ο蠹夹g(shù)來改善代碼,提高代碼的重復(fù)利用。
我在程序設(shè)計的時候比較喜歡把它分成五層:表示層(Web)、業(yè)務(wù)邏輯層(BusinessRule)、數(shù)據(jù)訪問層(DataAccess)、數(shù)據(jù)層(Data)、系統(tǒng)框架層(Framework).
表示層:直接與用戶面對面,可以的DV+CSS+JavaScript來完成。如果用到XML 還可以用XSLT等技術(shù)來實現(xiàn)。
業(yè)務(wù)邏輯層:對系統(tǒng)的業(yè)務(wù)的實現(xiàn),大多數(shù)的開發(fā)人員都認(rèn)為這層是復(fù)雜的。很少有一定的規(guī)則可循。
數(shù)據(jù)訪問層:實現(xiàn)對實體數(shù)據(jù)和虛擬數(shù)據(jù)的操作。
數(shù)據(jù)層:在微軟的多層架構(gòu)里,這層是手寫的與關(guān)系數(shù)據(jù)庫相對應(yīng)。還要還用XST模式。
系統(tǒng)框架層:主要是對一基本的信息進(jìn)行配置。
這五層架構(gòu)可以做成通用的一種架構(gòu)?,F(xiàn)在就來具體說說這五層架構(gòu)中的每個層次關(guān)系和各各層次的功能。
系統(tǒng)框架層的簡單應(yīng)用就是寫成數(shù)據(jù)庫的配置,
public class DBConfigration
{
public static string ConnectionString="server=數(shù)據(jù)庫服務(wù)器;User ID=登錄名;Password=密碼;initial catalog=數(shù)據(jù)庫";
public DBConfigration()
{
// TODO: 讀取XML文件的數(shù)據(jù)庫的配置
string fileName =AppDomain.CurrentDomain.BaseDirectory.ToString()+ @"\dataBaseConnect.xml";
string connectstring = "";
XmlTextReader tr = new XmlTextReader(fileName);
while(tr.Read())
{
if(tr.NodeType==XmlNodeType.Text)
{
connectstring = tr.Value;
break;
}
}
tr.Close();
tr=null;
if (connectstring.Length<10)
{
ConnectionString="server=數(shù)據(jù)庫服務(wù)器;User ID=登錄名;Password=密碼;initial catalog=數(shù)據(jù)庫";
}
else
{
ConnectionString = connectstring;
}
}
}
這樣可能通過改變XML文件里的數(shù)據(jù)庫的配置,而不必編譯文件,對于系統(tǒng)的移植來說相對比較方便,當(dāng)然這種方法不是一種好方法。對于開發(fā)小型的單一的系統(tǒng)還是很好用的。
數(shù)據(jù)層(Data)
定義一個基類,把基本的字段類型都提取出來。便于管理
public class BaseDataColumn : DataColumn
{
// 定義變量
// 設(shè)置字段是否為關(guān)鍵字段。
private bool isKeyColumn;
// 設(shè)置字段是否為有效字段。
private bool isValidColumn;
// 設(shè)置字段是否允許中文。
private bool isDBCSColumn;
// 設(shè)置字段的“SqlDbType”類型。
private SqlDbType columnSqlDbType;
// 若為數(shù)字型字段,記錄字段的最大值。
private double columnMaxValue = 0;
// 若為數(shù)字型字段,記錄字段的最小值。
private double columnMinValue = 0;
// 若為數(shù)字型字段,記錄字段的小數(shù)點位數(shù)。
private int columnDecimalPosition = -1;
//定義方法
// 返回是否為關(guān)鍵字列
public bool IsKeyColumn()
{
return isKeyColumn;
}
// 返回是否為有效列
public bool IsValidColumn()
{
return isValidColumn;
}
// 設(shè)置關(guān)鍵字列狀態(tài)
public void SetKeyState(bool isKS)
{
isKeyColumn = isKS;
}
// 設(shè)置有效列狀態(tài)
public void SetValidState(bool isVS)
{
isValidColumn = isVS;
}
// 返回是否為有效列
public bool IsDBCSColumn()
{
return isDBCSColumn;
}
// 設(shè)置關(guān)鍵字列狀態(tài)
public void SetDBCSState(bool isDBCS)
{
isDBCSColumn = isDBCS;
}
// 獲取列的 SqlDbType
public SqlDbType GetColumnSqlDbType()
{
return columnSqlDbType;
}
// 設(shè)置列的最大長度
public void SetMaxLength(int length)
{
MaxLength = length;
}
// 設(shè)置列的最大值
public void SetMaxValue(double value)
{
columnMaxValue = value;
}
// 設(shè)置列的最小值
public void SetMinValue(double value)
{
columnMinValue = value;
}
// 設(shè)置數(shù)字列的小數(shù)點位數(shù)。
public void SetDecimalPosition(int position)
{
columnDecimalPosition = position;
}
// 獲取數(shù)字列的小數(shù)點位數(shù)。
public int GetDecimalPosition()
{
return columnDecimalPosition;
}
// 重載重構(gòu)函數(shù)
public BaseDataColumn(bool isKS, bool isVS) : base()
{
isKeyColumn = isKS;
isValidColumn = isVS;
columnSqlDbType = SqlDbType.VarChar;
isDBCSColumn = false;
}
public BaseDataColumn() : base()
{
isKeyColumn = false;
isValidColumn = true;
columnSqlDbType = SqlDbType.VarChar;
isDBCSColumn = false;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType , System.String expr , System.Data.MappingType type ) : base( columnName ,CommonInfo.GetSystemType(dataType) , expr , type )
{
isKeyColumn = false;
isValidColumn = true;
columnSqlDbType = dataType;
isDBCSColumn = false;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType , System.String expr ) : base( columnName ,CommonInfo.GetSystemType(dataType) ,expr )
{
isKeyColumn = false;
isValidColumn = true;
columnSqlDbType = dataType;
isDBCSColumn = false;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType ) : base( columnName , CommonInfo.GetSystemType(dataType) )
{
isKeyColumn = false;
isValidColumn = true;
columnSqlDbType = dataType;
isDBCSColumn = false;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType, bool isKS, bool isVS ) : base( columnName , CommonInfo.GetSystemType(dataType) )
{
isKeyColumn = isKS;
isValidColumn = isVS;
columnSqlDbType = dataType;
isDBCSColumn = false;
this.ColumnName = columnName;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType, bool isKS, bool isVS,int isAutoADD ) : base( columnName , CommonInfo.GetSystemType(dataType) )
{
isKeyColumn = isKS;
isValidColumn = isVS;
columnSqlDbType = dataType;
isDBCSColumn = false;
if (isAutoADD==1)
{
this.AutoIncrement = true;
}
this.ColumnName = columnName;
}
public BaseDataColumn( System.String columnName , SqlDbType dataType, bool isKS, bool isVS, bool isDBCS ) : base( columnName , CommonInfo.GetSystemType(dataType) )
{
isKeyColumn = isKS;
isValidColumn = isVS;
columnSqlDbType = dataType;
isDBCSColumn = isDBCS;
}
public BaseDataColumn( System.String columnName ) : base( columnName )
{
isKeyColumn = false;
isValidColumn = true;
columnSqlDbType = SqlDbType.VarChar;
isDBCSColumn = false;
}
}
再定義一個抽象類。用于其子類的繼承來。
public class BaseDataSet : DataSet
{
public BaseDataSet()
{
//BuildDataTables();
}
// 構(gòu)建 DataSet 中所有表、字段和關(guān)鍵字
protected virtual void BuildDataTables()
{
}
}
這樣就完成了基礎(chǔ)建設(shè)
接下來就是對各各數(shù)據(jù)表結(jié)構(gòu)的定義和操作
我們來舉個例子
這是聲明一個數(shù)據(jù)集,叫數(shù)據(jù)表的名字是t_hotsubject_column,有九個字段,并分別定義他們數(shù)據(jù)類型,是否是關(guān)鍵字,是否是有效字。
public class columnClass:BaseDataSet
{
public const string T_HOTSUBJECT_COLUMN_CLASS_TABLE ="t_hotsubject_column";
public const string COLUMNID_CLASS_FIELD ="columnid";
public const string HOTSUBJECTID_CLASS_FIELD ="hotsubjectid";
public const string COLUMNTITTLE_CLASS_FIELD ="columntittle";
public const string PARENTID_CLASS_FIELD ="parentid";
public const string COLUMNPOSITION_CLASS_FIELD ="columnposition";
public const string COLUMNCREATOR_CLASS_FIELD ="columncreator";
public const string COLUMNDESCRIPTION_CLASS_FIELD ="columndescription";
public const string DEPTNO_CLASS_FILED ="deptno";
public const string LOCKED_CLASS_FILED ="locked";
public columnClass()
{
BuildDataTables();// TODO: 在此處添加構(gòu)造函數(shù)邏輯
}
protected override void BuildDataTables()
{
DataTable columnTable=new DataTable(T_HOTSUBJECT_COLUMN_CLASS_TABLE);
DataColumnCollection columnColumns=columnTable.Columns;
columnColumns.Add(new BaseDataColumn(COLUMNID_CLASS_FIELD,SqlDbType.Int,true,true));
columnColumns.Add(new BaseDataColumn(HOTSUBJECTID_CLASS_FIELD,SqlDbType.Int,false,true));
columnColumns.Add(new BaseDataColumn(COLUMNTITTLE_CLASS_FIELD,SqlDbType.VarChar,false,true));
columnColumns.Add(new BaseDataColumn(PARENTID_CLASS_FIELD,SqlDbType.VarChar,false,true));
columnColumns.Add(new BaseDataColumn(COLUMNPOSITION_CLASS_FIELD,SqlDbType.Int,false,true));
columnColumns.Add(new BaseDataColumn(COLUMNCREATOR_CLASS_FIELD,SqlDbType.NVarChar,false,true));
columnColumns.Add(new BaseDataColumn(COLUMNDESCRIPTION_CLASS_FIELD,SqlDbType.NText,false,true));
columnColumns.Add(new BaseDataColumn(DEPTNO_CLASS_FILED,SqlDbType.Int,false,true));
columnColumns.Add(new BaseDataColumn(LOCKED_CLASS_FILED,SqlDbType.Char,false,true));
this.Tables.Add(columnTable);
}
}
這種方法也不是最好的方法,我們要以通過XST模式來生成XML的數(shù)據(jù)集合。這個以后再補(bǔ)充。