国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

架構設計之首部曲

2024-07-21 02:17:07
字體:
來源:轉載
供稿:網友
系統采用|b/s結構,共分三層,分別是數據訪問層,業務規則層,web外觀層。它們各自有自己的職責,各自為政又互相配合從而形成一個軟件的整體功能系統,數據訪問層的職責是負責對數據源的存?。ㄟ@里的數據源是指sql server 2000),業務規則層負責的是對數據按照業務流程的處理,web外觀層負責向用戶提供交互的接口,只負責輸入輸出數據。這樣設計是很普遍的,它提供了一個較好維護的體系。

設計:

1) 數據訪問層:

很多人愿意在這一層封裝大量的sql腳本以簡化上層的設計,但是這樣的設計并不合適!業務一般情況下會有變化,如果把sql腳本“硬編碼”在一起,修改時不得不修改程序的源代碼。而用戶那里一般只有打包的二進制程序!所以較好的做法是將對數據的操作的腳本放在外面,一般是放在離數據近的地方,如sql server上,這里我們把它

編寫成存儲過程放在sql server服務器上。編寫成存儲過程有這樣的兩個好處:第一,業務改變時,只要改存儲過程即可。第二,沒有必要將大量的腳本通過網絡傳輸到數據庫服務器解析執行,給網絡帶來很大的負擔。而是只是調用一個存儲過程名而已,大大降低了網絡負擔和中間層的負擔。 如:執行添加用戶的操作

create procedure dbo.user_create

@realname varchar(50),

@deptname varchar(50),

@hashedpassword varchar(50),

@tel varchar(50),

@address varchar(50),

@dutyname varchar(50),

@username varchar(50)

as

begin tran

insert into [user] (username,realname,deptname,hashedpassword,tel,address,dutyname) values(@username,@realname,@deptname,@hashedpassword,@tel,@address,@dutyname)

if @@error!=0

begin

rollback

return 0

end

else

begin

commit

return 1

end



對于執行存儲過程和維護和數據庫連接狀態的方法(如:execsql(string sql),open())應當封裝在一個公共類中共其他類使用,而不是每個類都有自己的數據庫方法!這樣的意圖是可以減少重復依賴,而且如果將這個共享類的方法抽象出來成為一個接口,讓所有用到他的類使用這個接口,在共享類發生變化時,使用它的類并不知曉這些變化,減少了依賴就意味著更好地適應變化!

如:

public class database : idisposable ,isqldatabase(參考于codeplus)

{

private sqlconnection con;

private dbconfig m_config=dbconfig.instance;

public int runproc(string procname)

{

sqlcommand cmd = createcommand(procname, null);

cmd.executenonquery();

this.close();

return (int)cmd.parameters["returnvalue"].value;

}

public int runproc(string procname, sqlparameter[] prams)

{

sqlcommand cmd = createcommand(procname, prams);

cmd.executenonquery();

this.close();

return (int)cmd.parameters["returnvalue"].value;

}
.......

}

接口:

public interface isqldatabase

{

int runproc(string procname) ;

int runproc(string procname, sqlparameter[] prams) ;

void runproc(string procname, out sqldatareader datareader) ;

void runcommand(string command,out sqldatareader datareader);

void runproc(string procname, sqlparameter[] prams, out sqldatareader datareader) ;

sqlcommand createcommand(string procname, sqlparameter[] prams) ;

void open();

void close() ;

sqlparameter makeinparam(string paramname, sqldbtype dbtype, int size, object value);

sqlparameter makeoutparam(string paramname, sqldbtype dbtype, int size);

sqlparameter makeparam(string paramname, sqldbtype dbtype, int32 size, parameterdirection direction, object value);

}

對于連接信息,如連接字符串不應在所有用到數據庫的地方出現,負責在部署時不得不在所有的類中調整!所以把它方在xml配置文件中是明智的(分成集成和混合安全性),再用一個類管理它即可.

xml文件的內容:



<?xml version="1.0" standalone="yes" ?>

<newdataset>

<dbconfig>

<servername>gaolei</servername>

<machine>gaolei</machine>

<database>oa</database>

</dbconfig>

<dbconfig>

<servername>gaolei</servername>

<uid>sa</uid>

<pwd></pwd>

<machine>gaolei</machine>

<database>oa</database>

</dbconfig>

<dbconfig>

<logcount>100</logcount>

</dbconfig>

</newdataset>。

對于數據實體層,它負責傳遞數據,是各層交換數據的地方。設計時應考慮這樣幾個因素:

第一:性能,交換數據的地方必須要求交換快、占內存少.

第二:業務規則類可以有效地使用他們。

第三:有利于界面部分使用它們,即要能和用戶控件綁定在一起使用,幫助簡化界面的開發。

為了滿足第一要求,可以將實體的值域上移放在基類中,這樣兩個類為繼承關系又各負各則?;悾〝抵殿悾┑膶嵗龜蹬c其子類(方法類)實例數不成比例,基類實例數總是大于方法實例數,一般是n:1,這樣消除了沒有必要的內存開支,大大提升了性能。對于有些方法參數列表太長,就可以使用基類對象代替。

方法類集成了常用的數據處理方法,所以一旦業務規則類使用它,可以大大簡化規則類的復雜度,設計者可以集中精力設計規則類而不必同時考慮實體類的問題。由于值域上移,把值域做成屬性,界面上的控件將天生支持對這些屬性的綁定。(.net控件的特性)

實體類:

(數值類)

public class logrow:marshalbyrefobject,icomparable

{

protected string m_operatetype;

public virtual string operatetype

{

get { return m_operatetype;}

set { m_operatetype=value;}

}

..........

public logrow()

{// todo: 在此處添加構造函數邏輯



}

#region icomparable 成員



public int compareto(object obj)

{

logrow row=(logrow)obj;

if(row.operator.equals(this.operator)&&row.operatetype.equals(this.operatetype)&&row.operatetime.equals(this.operatetime)&&row.contents.equals(this.contents))

return 1;

return 0;

}



#endregion

}

方法類:

public class log:logrow

{

public log()

{

}

public bool create(string operatetype,string contents,string operator,system.datetime operatetime)

{

database data = new database();

sqlparameter[] prams = {

data.makeinparam("@operatetype",system.data.sqldbtype.varchar,50,operatetype),

data.makeinparam("@contents",system.data.sqldbtype.varchar,255,contents),

data.makeinparam("@operator",system.data.sqldbtype.varchar,50,operator),

data.makeinparam("@operatetime",system.data.sqldbtype.datetime,8,operatetime)

};

int reval = data.runproc("log_create",prams);

data.close();

data.dispose();

if(reval==1)

{

return true;

}

else

{

return false;

}

}

public bool create(logrow logobject)

{

return this.create(logobject.operatetype,logobject.contents,logobject.operator,logobject.operatetime);

}

public bool delete(system.datetime operatetime)

{

database data = new database();

sqlparameter[] prams = {

data.makeinparam("@operatetime",system.data.sqldbtype.datetime,8,operatetime)

};

int reval = data.runproc("log_delete",prams);

data.close();

data.dispose();

if(reval==1)

{

return true;

}

else

{

return false;

}

}

.......

}

2) 業務歸則層:

要有自己獨立的自定義異常類,對于業務方法要適當使用多線程提升性能。最好使用teampletemothed模式集成流程和適應未來的業務變化或者將方法設置成virtual!

public class ommanager

{

private user user;

private userrole userrole;

private role role;

private rolepopedom rolepopedom;

private string m_currentusername;

private string m_currentpassword;

public ommanager(string currentusername,string currentuserencryptedpassword)

{



user=new user();

userrole=new userrole();

role=new role();

rolepopedom=new rolepopedom();

if((new securityvalidate()).validator(currentusername,currentuserencryptedpassword))

{

this.m_currentusername=currentusername;

this.m_currentpassword=currentuserencryptedpassword;

}

else

{

throw new securityexception("無效用戶名/密碼");

}

}

public virtual string newuser(userrow newuserdata, string[] assignedroles)

{

string m_hashedpassword=stringencryptor.encryptor(newuserdata.hashedpassword);

newuserdata.hashedpassword=m_hashedpassword;

if(user.create(newuserdata)&&userrole.create(newuserdata.username,assignedroles))

{
//todosomething
}

return null;

}

........}

3)web界面層:要使用規則層的方法執行業務功能,但并不是什么都要通過規則層,而是數據需要業務處理的就引用規則層方法,如果業務上不需要處理(如:填充一個下拉列表)就可以直接使用數據訪問層,這樣可以減少沒必要的性能開支。對于安全性,就是要使用規則類必須經過驗證。對于性能可以使用asp.net的緩存技術解決


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都安| 湖口县| 藁城市| 容城县| 甘肃省| 军事| 望都县| 洪泽县| 秭归县| 吉隆县| 曲水县| 黎平县| 遂溪县| 湖南省| 镇平县| 大同县| 江门市| 平原县| 通州市| 蓝田县| 宣城市| 左云县| 桐庐县| 赫章县| 黄龙县| 桓台县| 嘉祥县| 疏附县| 盐山县| 阿拉善右旗| 清镇市| 中方县| 高密市| 澳门| 奎屯市| 宜阳县| 上高县| 胶南市| 静海县| 农安县| 南康市|