青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

twzheng's cppblog

『站在風口浪尖緊握住鼠標旋轉!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  136 隨筆 :: 78 文章 :: 353 評論 :: 0 Trackbacks
[轉]實戰剖析三層架構1 
摘自:笨笨的熊窩
原文地址:http://www.cnblogs.com/benbenkoala/archive/2008/10/31/1209658.html
   引言:本文不是從理論的角度來探討三層架構,而是用一個示例來介紹如何建設一個三層架構的項目,并說明項目中各個文件所處的層次與作用。寫本文的目的,不是為了說明自己的這個方法有多對,別人的肯定不對,而是希望給那些初學三層架構卻不知從何入手的朋友提供一點幫助。因為網上的文章,大多是注重理論的介紹,而忽略了具體的實踐應用,或者有示例但講得不透徹。導致看了之后,理論上又學習了一遍,但還是不知道代碼怎么寫。所以想從這個方面入手寫一下,讓從來沒做過三層架構的初學者也能照貓畫虎,寫出代碼來。文章表述的是筆者個人對三層架構的認識,肯定有許多不足的地方,歡迎大家指正,小弟也會根據反饋來修改這篇文章。文中的代碼是偽代碼,僅用來闡明思路。
    正文:
    一提三層架構,大家都知道是表現層(UI),業務邏輯層(BLL)和數據訪問層(DAL),而且每層如何細分也都有很多的方法。但具體代碼怎么寫,到底那些文件算在哪一層,卻是模模糊糊的。下面用一個簡單的例子來帶領大家實戰三層架構的項目,這個例子只有一個功能,就是用戶的簡單管理。
    首先建立一個空白解決方案,添加如下項目及文件
    1、添加ASP.NET Web Application項目,命名為UI,新建Web Form類型文件User.aspx(含User.aspx.cs
    2、添加ClassLibrary項目,命名為BLL,新建Class類型文件UserBLL.cs
   
3、添加ClassLibrary項目,命名為DAL,新建Class類型文件UserDAL.cs。添加SQLHelper引用。(這個是微軟的數據訪問類,也可以不用,直接編寫所有的數據訪問代碼。我一般用自己寫的數據訪問類DataAccessHelper )。
    4、添加ClassLibrary項目,命名為Model,新建Class類型文件UserModel.cs
    5、添加ClassLibrary項目,命名為IDAL,新建Interface類型文件IUserDAL.cs
    6、添加ClassLibrary項目,命名為ClassFactory
    相信大家已經看出來了,這個和Petshop的示例沒什么區別,而且更簡單,因為在下也是通過Petshop學習三層架構的。但一些朋友對于這幾個項目所處的層次,以及它們之間的關系,可能比較模糊,這里逐個說明一下:
    1User.aspxUser.aspx.cs
    這兩個文件(以及文件所屬的項目,下面也是如此,不再重復強調了)都屬于表現層部分。User.aspx比較好理解,因為它就是顯示頁面了。User.aspx.cs有些人覺得不應該算,而是要劃到業務邏輯層中去。如果不做分層的話,那么讓User.aspx.cs來處理業務邏輯,甚至操作數據庫都沒什么問題,但是做分層的話,這樣就不應該了。在分層結構中,User.aspx.cs僅應該處理與顯示有關的內容,其它部分都不應該涉及。
    舉例:我們實現用列表方式顯示用戶的功能,那么提取信息的工作是由BLL來做的,UI(本例中是User.aspx.cs)調用BLL得到UserInfo后,通過代碼綁定到User.aspx的數據控件上,就實現了列表的顯示。在此過程中User.aspx.csUI沒有起到什么作用,僅是用來傳遞數據,而且因為實際編碼中大部分情況都是如此的實現,所以使有些人覺得User.aspx.cs不應該算UI,而應該并入BLL負責邏輯處理。繼續往下看,這時提出了一個新需求,要求在每個用戶的前面加一個圖標,生動地表現出用戶的性別,而且不滿18歲的用兒童圖標表示。這個需求的實現,就輪到User.aspx.cs來做了,這種情況下User.aspx.cs才算有了真正的用途。
    2NewBLL.cs
    添加如下方法:
    public IList<UserInfo> GetUsers():返回所有的用戶信息列表
    public UserInfo GetUser(int UserId):返回指定用戶的詳細信息
    public bool AddUser(UserInfo User):新增用戶信息
    public bool ChangeUser(UserInfo User):更新用戶信息
    public void RemoveUser(int UserId):移除用戶信息
    此文件就屬于業務邏輯層了,專門用來處理與業務邏輯有關的操作。可能有很多人覺得這一層唯一的用途,就是把表現層傳過來的數據轉發給數據層。這種情況確實很多,但這只能說明項目比較簡單,或者項目本身與業務的關系結合的不緊密(比如當前比較流行的MIS),所以造成業務層無事可做,只起到了一個轉發的作用。但這不代表業務層可有可無,隨著項目的增大,或者業務關系比較多,業務層就會體現出它的作用來了。
    此處最可能造成錯誤的,就是把數據操作代碼劃在了業務邏輯層,而把數據庫作為了數據訪問層。
    舉例:有些朋友感覺BLL層意義不大,只是將DAL的數據提上來就轉發給了UI,而未作任何處理。看一下這個例子
    BLL
    SelectUserUserInfo userInfo)根據傳入的usernameemail得到用戶詳細信息。
    IsExistUserInfo userInfo)判斷指定的usernameemail是否存在。
    然后DAL也相應提供方法共BLL調用
    SelectUserUserInfo userInfo
    IsExistUserInfo userInfo
    這樣BLL確實只起到了一個傳遞的作用。
   
但如果這樣做:
    BLL.IsExistUserinfo userinfo
    {
          UerInfo user = DAL.SelectUserUser);
       
return (userInfo.Id != null); 
    }
    那么DAL就無需實現IsExist()方法了,BLL中也就有了邏輯處理的代碼。
    3UserModel.cs
    實體類,這個東西,大家可能覺得不好分層。包括我以前在內,是這樣理解的:UIßàModelßàBLLßàModelßàDAL,如此則認為Model在各層之間起到了一個數據傳輸的橋梁作用。不過在這里,我們不是把事情想簡單,而是想復雜了。
    Model是什么?它什么也不是!它在三層架構中是可有可無的。它其實就是面向對象編程中最基本的東西:類。一個桌子是一個類,一條新聞也是一個類,intstringdoublie等也是類,它僅僅是一個類而已。
    這樣,Model在三層架構中的位置,和intstring等變量的地位就一樣了,沒有其它的目的,僅用于數據的存儲而已,只不過它存儲的是復雜的數據。所以如果你的項目中對象都非常簡單,那么不用Model而直接傳遞多個參數也能做成三層架構。
    那為什么還要有Model呢,它的好處是什么呢。下面是思考一個問題時想到的,插在這里:    
    Model
在各層參數傳遞時到底能起到做大的作用?
    在各層間傳遞參數時,可以這樣:
    AddUseruserIduserNameuserPassword,)
    也可以這樣:
    AddUseruserInfo
    這兩種方法那個好呢。一目了然,肯定是第二種要好很多。
    什么時候用普通變量類型(int,string,guid,double)在各層之間傳遞參數,什么使用Model傳遞?下面幾個方法:
   
SelectUserint UserId
    SelectUserByNamestring username
    SelectUserByNamestring usernamestring password
    SelectUserByEmailstring email
   
SelectUserByEmailstring emailstring password
    可以概括為:
    SelectUseruserId
    SelectUseruser
    這里用user這個Model對象囊括了usernamepasswordemail這三個參數的四種組合模式。UserId其實也可以合并到user中,但項目中其它BLL都實現了帶有id參數的接口,所以這里也保留這一項。 
    傳入了userInfo,那如何處理呢,這個就需要按照先后的順序了,有具體代碼決定。
    這里按這個順序處理
    首先看是否同時具有usernamepassword,然后看是否同時具有emailpassword,然后看是否有username,然后看是否有email。依次處理。
    這樣,如果以后增加一個新內容,會員卡(number),則無需更改接口,只要在DAL的代碼中增加對number的支持就行,然后前臺增加會員卡一項內容的表現與處理即可。 
    4UserDAL.cs
    public IList<UserInfo> SelectUsers():返回所有的用戶信息列表
    public UserInfo SelectUser(int UserId):返回指定用戶的相信信息
    public bool InsertUser(UserInfo User):新增用戶信息
    public bool UpdateUser(UserInfo User):更新用戶信息
    public void DeleteUser(int UserId):移除用戶信息
    很多人最鬧不清的就是數據訪問層,到底那部分才算數據訪問層呢?有些認為數據庫就是數據訪問層,這是對定義沒有搞清楚,DAL是數據訪問層而不是數據存儲層,因此數據庫不可能是這一層的。也有的把SQLHelper(或其同類作用的組件)作為數據訪問層,它又是一個可有可無的東西,SQLHelper的作用是減少重復性編碼,提高編碼效率,因此如果我習慣在乎效率或使用一個非數據庫的數據源時,可以丟棄SQLHelper,一個可以隨意棄置的部分,又怎么能成為三層架構中的一層呢。
    可以這樣定義:與數據源操作有關的代碼,就應該放在數據訪問層中,屬于數據訪問層
    5IUserDAL
    數據訪問層接口,這又是一個可有可無的東西,因為Petshop中帶了它和ClassFactory類工廠,所以有些項目不論需不需要支持多數據源,都把這兩個東西做了進來,有的甚至不建ClassFactory而只建了IDAL,然后“IUserDAL iUserDal = new UserDAL();”,不知意義何在。這就完全是畫虎不成反類犬了。
   
許多人在這里有一個誤解,那就是以為存在這樣的關系:BLLßàIDALßàDAL,認為IDAL起到了BLLDAL之間的橋梁作用,BLL是通過IDAL來調用DAL的。但實際是即使你如此編碼:“IUserDAL iUserDal = ClassFacotry.CreateUserDAL();”,那么在執行“iUserDal.SelectUsers()”時,其實還是執行的UserDAL實例,而不是IUserDAL實例,所以IDAL在三層中的位置是與DAL平級的關系。
    通過上面的介紹,基本上將三層架構的層次結構說明了。其實,本人有一個判斷三層架構是否標準的方法,那就是將三層中的任意一層完全替換,都不會對其它兩層造成影響,這樣的構造基本就符合三層標準了(雖然實現起來比較難^_^)。例如如果將項目從B/S改為C/S(或相反),那么除了UI以外,BLLDAL都不用改動;或者將SQLServer改為Oracle,只需替換SQLServerDALOracleDAL,無需其它操作等等。本來想在文中加入一些具體的代碼的,但感覺不是很必要,如果大家覺得需要的話,我再補充吧。
    總結:不要因為某個層對你來說沒用,或者實現起來特別簡單,就認為它沒有必要,或者摒棄它,或者挪作它用。只要進行了分層,不管是幾層,每一層都要有明確的目的和功能實現,而不要被實際過程所左右,造成同一類文件位于不同層的情況發生。也不要出現同一層實現了不同的功能的情況發生。
posted on 2008-11-16 22:59 譚文政 閱讀(1565) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区免费在线| 亚洲国产va精品久久久不卡综合| 欧美亚洲在线视频| 欧美一区二区成人| 欧美日韩一级视频| 浪潮色综合久久天堂| 欧美一区在线看| 9人人澡人人爽人人精品| 久久精品国产久精国产思思| 亚洲欧美一区二区三区久久 | 在线播放日韩欧美| 欧美日本不卡高清| 美女脱光内衣内裤视频久久网站| 欧美一区高清| 亚洲欧美中文日韩v在线观看| 有码中文亚洲精品| 欧美精品久久久久久久久久| 亚洲欧美日韩另类| 久久九九国产| 亚洲自拍偷拍视频| 欧美精品大片| 欧美视频一区二区三区…| 欧美精品91| 国产欧美一区二区视频| 在线电影欧美日韩一区二区私密| 欧美a级在线| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美激情区在线播放| av成人国产| 国产精品vvv| 久久免费精品日本久久中文字幕| 一区二区欧美国产| 免费高清在线一区| 欧美日韩国内| 国产精品影院在线观看| 国产一区二区三区久久久| 国产精品永久免费观看| 欧美三日本三级少妇三99 | 亚洲精品裸体| 欧美一级二区| 久久综合伊人77777| 亚洲欧美日韩电影| 亚洲国产日韩欧美一区二区三区| 亚洲欧美国产一区二区三区| 午夜性色一区二区三区免费视频| 玖玖玖国产精品| 亚洲国产精品一区二区久| 亚洲午夜精品久久久久久app| 老**午夜毛片一区二区三区| 国产精品久久久久久av下载红粉| 一区在线播放视频| 久久成人国产| 噜噜爱69成人精品| 亚洲少妇自拍| 老司机一区二区三区| 国产亚洲成av人在线观看导航| 每日更新成人在线视频| 久久亚洲春色中文字幕久久久 | 欧美 日韩 国产 一区| 国产精品国产三级国产专播品爱网 | 亚洲国产成人精品女人久久久 | 亚洲国产一成人久久精品| 国产一区二区三区奇米久涩 | 欧美一区免费视频| 亚洲电影专区| 久热精品在线视频| 欧美一区二区三区成人| 国产精品一区2区| 免费成人av在线看| 一二三区精品| 国产精品99免费看| 久久精品亚洲精品国产欧美kt∨| 久久免费观看视频| 一本色道久久综合亚洲二区三区| 久久九九国产精品怡红院| 影音先锋一区| 欧美久久久久中文字幕| 亚洲视频在线播放| 欧美大片专区| 亚洲激情视频网| 先锋a资源在线看亚洲| 亚洲三级国产| 一区二区三区.www| 最新国产精品拍自在线播放| 日韩亚洲国产精品| 日韩一区二区精品视频| 可以看av的网站久久看| 亚洲福利av| 亚洲第一福利在线观看| 久久不射网站| 老司机一区二区| 伊人久久男人天堂| 国产精品入口66mio| 日韩亚洲不卡在线| 久久久精品国产免大香伊| 欧美日韩另类视频| 午夜亚洲激情| 亚洲人成网在线播放| 日韩一级大片在线| 国产精品高潮粉嫩av| 国模大胆一区二区三区| 久久精品国语| 久久在线91| 亚洲欧美一区二区精品久久久| 久久精品论坛| 久久综合中文| 香蕉亚洲视频| 国语自产精品视频在线看抢先版结局| 久久久精品网| 亚洲国产影院| 欧美成人午夜视频| 一区二区三区精品久久久| 国产精品jvid在线观看蜜臀| 亚洲在线国产日韩欧美| 蜜臀av国产精品久久久久| 在线成人黄色| 国产精品都在这里| 欧美人与性动交a欧美精品| 亚洲美女av网站| 先锋影音网一区二区| 国产精品日韩一区| 老司机一区二区| 亚洲一区久久久| 一区二区三区高清在线| 亚洲理论在线| 中文一区二区| 久久影院午夜论| 香蕉av777xxx色综合一区| 羞羞漫画18久久大片| 国产亚洲毛片| 免费看成人av| 欧美激情五月| 久久另类ts人妖一区二区| av成人福利| 欧美大胆成人| 国产精品夜色7777狼人| 亚洲人精品午夜| 午夜老司机精品| 欧美在线观看天堂一区二区三区| 午夜视频一区二区| 一区二区三区产品免费精品久久75| 久久久久久网| 亚洲精品久久视频| 这里是久久伊人| 亚洲综合电影| 欧美一区二区私人影院日本| 亚洲一二三区精品| 欧美在线视频一区| 久久一区二区三区四区五区| 奶水喷射视频一区| 国产精品综合av一区二区国产馆| 国产精品一区二区欧美| 国产亚洲成人一区| 亚洲国产精品久久久久秋霞不卡| 亚洲精品久久久久| 亚洲伊人网站| 久久久夜精品| 亚洲精品欧美日韩| 亚洲一区黄色| 亚洲高清视频在线| 亚洲女同同性videoxma| 农村妇女精品| 国内自拍一区| 美女啪啪无遮挡免费久久网站| aⅴ色国产欧美| 久久久国产精品一区二区三区| 欧美18av| 一区视频在线| 一区二区欧美精品| 亚洲电影中文字幕| 久久综合99re88久久爱| 欧美日韩三级视频| 国模私拍一区二区三区| 午夜日韩激情| 久久精品视频导航| 国产日韩综合| 夜夜爽www精品| 国产一区二区三区四区hd| 久久不射2019中文字幕| 可以免费看不卡的av网站| 亚洲美洲欧洲综合国产一区| 亚洲视频在线二区| 亚洲精品日韩精品| 国产一区二区成人| 亚洲伊人久久综合| 欧美一区二区在线免费播放| 伊人天天综合| 久久亚洲一区二区| 在线视频一区观看| 久久国产福利| 亚洲无限av看| 久久免费高清| 亚洲欧美文学| 国产精品啊啊啊| 夜久久久久久| 亚洲精品一区二区三区婷婷月| 亚洲免费视频在线观看| 亚洲精品美女免费| 久久综合九色综合欧美就去吻 | 国产精品一页|