影音先锋男人资源av站_狠狠色综合激情丁香五月_爱爱爱爱看视频_在线播放免费人成视频在线观看_少妇人妻综合久久中文字幕_国产午夜无码精品免费看_久久久久久夜精品精品免费啦_男人女人午夜视频免费_日本xxxx裸体xxxx_丰满人妻熟妇乱又仑精品

電子科大論壇-非清水河畔

 找回密碼
 注冊(開放注冊)
查看: 11579|回復: 0
打印 上一主題 下一主題

[應用技術] 總結:分層結構、反射與OR映射

[復制鏈接]
跳轉到指定樓層
1#
發(fā)表于 2007-11-30 09:27:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
對軟件進行分層可以達到結構清晰、易于重用的目的。軟件的分層類似于社會的分工,有了分工,人們就可以專司其職,搞IT的就不用邊寫.NET程序邊種莊稼了。

在軟件結構中,分層結構是一種最易于理解的結構。下面介紹的是一個簡單的分層結構,它可以用在一些簡單的項目上(實際上它正在被使用),如進銷存系統(tǒng)這類主要和數據庫打交道的系統(tǒng)。

1、數據訪問層
(1)使用工廠模式實現(xiàn)的通用數據訪問功能。關于如何用工廠模式實現(xiàn)此功能,網上很多,實現(xiàn)起來也比較容易,可以使用IdbConnection、IdbCommand、IdbTransaction等接口。這里就不再說了。

(2)基于反射,實現(xiàn)“實體類<——>Sql語句”。包含BuildCreateObjSql(生成Insert語句)、BuildUpdateObjSql(生成Update語句)、BuildSelectObjSql(生成Select語句)、BuildObj(由IdataReade創(chuàng)建實體類對象,并為成員變量賦值)、BuildObjs(由DataTable生成實體類對象數組)等方法,方法實現(xiàn)過程類似如下(省略部分代碼,要求實體類名=數據庫表名,實體屬性名=數據庫表字段名):


public static string BuildCreateObjSql(object pObj)
{
…………
Type t= pObj.GetType();
PropertyInfo[] pis=t.GetProperties();
for(int i=0;i<PIS.LENGTH;I++)
{
switch(pis.PropertyType.ToString())
{
case"System.Int32":
fieldString+=pis.Name;
valueString+=pis.GetValue(pObj,null).ToString();
break;
case"System.String":
…………
}
if(i<PIS.LENGTH-1)
{
fieldString+=",";
valueString+=",";
}
}
result="insert into "+t.Name+"("+fieldString+") values("+valueString+")"+";";
return result;
}


public static object BuildObj(string pClassName,IDataReader pReader)
{
Type t=Type.GetType(namespace+ pClassName);
PropertyInfo[] pis=t.GetProperties();
object obj=Activator.CreateInstance(t);
BindValue (obj,pis,pReader); //為各字段賦值
return obj;
}


private static void BindValue (object pObj,PropertyInfo[] pPis,IDataReader pReader)
{
for(int i=0;i<PPIS.LENGTH;I++)
{
for(int j=0;j<PREADER.FIELDCOUNT;J++)
{
switch(pPis.PropertyType.ToString())
{
case"System.Int32":
pPis.SetValue(pObj,int.Parse(pReader[pPis.Name].ToString()),null);
break;
case"System.String":
…………;
break;
}
}
}
}

2、實體層
該層包含所有的實體類。假設數據庫中存在一表叫Book的表,包括id,bookname,price,authorid字段,那么對應的實體類類似如下(當數據庫表數量較多時,編寫實體類的工作會顯示枯燥無味,好像現(xiàn)在有不少工具可以完成由數據庫表生成實體類文件的工作):

public class Book : EntityHome
{
private string m_BookName;
private decimal m_Price;
private int m_AuthorID;

public Book()
{
}

public Book(int ID,string BookName, decimal Price, int AuthorID)
{
this.ID=ID;
this.BookName=BookName;
this.Price=Price;
this.AuthorID=AuthorID;
}

public string BookName
{
get
{
return this.m_BookName;
}
set
{
this.m_BookName=value;
}
}

public decimal Price
{
…………
}

public int AuthorID
{
…………
}
}

3、業(yè)務層:
在業(yè)務層中,包含了所有的控制類,它們與上面的實體類一一對應,主要的繼承鏈始于:SingleHomeCtr(處理單個實體類的控制類基類);MultiHomeCtr(處理多個實體類的控制類),類似如下:

public class BookCtr:SingleHomeCtr
{
public BookCtr()
{
}

public void CreateObj(Book obj)
{
//通過數據訪問層中的反射方法,生成sql語句,并最終持久化成數據庫表中的一條記錄。
…………
}

public Book RetrieveObj(int id)
{
//通過數據訪問層中的方法,生成sql語句,并最終返回一個Book對象。
…………
}

public void UpdateObj(Book obj)
{
//通過數據訪問層中的反射方法,生成sql語句,并最終持久化成數據庫表中的一條記錄。
…………
}
}

4、UI層
有了以上的準備工作,在界面上對數據庫的操作,就可以“對象化”了,例如根據數據庫表的一條記錄創(chuàng)建一個Book對象:
Book b = null;
BookCtr bctr = new BookCtr();
b = bctr.RetrieveObj(id);
或者持久化一條數據到數據庫(對象的CreateObj方法)、或者更新一條數據庫記錄(對象的UpdateObj方法)。

5、最后
在這個結構中包含了OR映射的概念。OR映射主要解決對象與關系數據之間的映射以及對象的持久化問題,翻譯成白話就是怎么樣把對數據庫的操作歸結到對對象的操作。這個工作有許多復雜的地方,不是憑借一己之力以完成的。所以在上面的示例中,實際情況是只能完成一些簡單的映射,對于一些所謂的“粗粒度對象”(即一個對象需要關聯(lián)多個數據庫表)的映射,實現(xiàn)起來比較困難。
來原: www
您需要登錄后才可以回帖 登錄 | 注冊(開放注冊)

本版積分規(guī)則

手機訪問本頁請
掃描左邊二維碼
本網站聲明
本網站所有內容為網友上傳,若存在版權問題或是相關責任請聯(lián)系站長!
站長電話:0898-66661599    站長聯(lián)系QQ:12726567   
站長微信:hainanok
請掃描右邊二維碼
www.myujob.com

小黑屋|手機版|Archiver|電子科大論壇-非清水河畔 ( 瓊ICP備10001196號-2 )

GMT+8, 2025-11-6 17:58 , Processed in 0.068891 second(s), 14 queries .

Powered by 校園招聘信息

© 2001-2020 電子科大論壇-非清水河畔校園招聘

快速回復 返回頂部 返回列表