<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        Community Server專題二:體系結(jié)構(gòu)

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:45:31
        文檔

        Community Server專題二:體系結(jié)構(gòu)

        Community Server專題二:體系結(jié)構(gòu):Community Server專題二:體系結(jié)構(gòu)在進(jìn)行CS細(xì)節(jié)分析的之前,有必要先了解CS工程(解決方案)的組成,以及組成CS工程中項(xiàng)目的結(jié)構(gòu),本文分為三個部分:1、工程結(jié)構(gòu) 2、三層構(gòu)架 3、數(shù)據(jù)庫構(gòu)架。1:工程結(jié)構(gòu)=538) {this.width=538;} borde
        推薦度:
        導(dǎo)讀Community Server專題二:體系結(jié)構(gòu):Community Server專題二:體系結(jié)構(gòu)在進(jìn)行CS細(xì)節(jié)分析的之前,有必要先了解CS工程(解決方案)的組成,以及組成CS工程中項(xiàng)目的結(jié)構(gòu),本文分為三個部分:1、工程結(jié)構(gòu) 2、三層構(gòu)架 3、數(shù)據(jù)庫構(gòu)架。1:工程結(jié)構(gòu)=538) {this.width=538;} borde

        Community Server專題二:體系結(jié)構(gòu)

        在進(jìn)行CS細(xì)節(jié)分析的之前,有必要先了解CS工程(解決方案)的組成,以及組成CS工程中項(xiàng)目的結(jié)構(gòu),本文分為三個部分:1、工程結(jié)構(gòu) 2、三層構(gòu)架 3、數(shù)據(jù)庫構(gòu)架。

        1:工程結(jié)構(gòu)

        按此在新窗口打開圖片

        CS工程主要分為4個部分

        a:系統(tǒng)底層構(gòu)架項(xiàng)目CommunityServerComponents、CommunityServerControls,提供給其他項(xiàng)目父類、接口、全局變量、CS系統(tǒng)設(shè)置、公用用戶自定義控件、用戶與權(quán)限管理業(yè)務(wù)邏輯、異常處理等。

        b: CommunityServerBlogs、CommunityServerForums、CommunityServerGalleries、 CommunityServerDocuments、CommunityServerGuestBook。這些項(xiàng)目都是通過繼承、調(diào)用全局方法等實(shí)現(xiàn)自己的業(yè)務(wù)邏輯并且抽象出自己的Data Provider,業(yè)務(wù)邏輯不同,但項(xiàng)目都是采用三層結(jié)構(gòu)。

        c:UI項(xiàng)目,這里指 CommunityServerWeb。該項(xiàng)目中幾乎不包含邏輯代碼,只是簡單的Html與對運(yùn)用項(xiàng)目中的Skin(Skin是 *.ascx文件,但沒有關(guān)聯(lián)相應(yīng)的*.cs,大致可以這樣理解:如CommunityServerBlogs 中的Skin 文件*.ascx相關(guān)聯(lián)的*.cs邏輯代碼在 CommunityServerBlogs項(xiàng)目中實(shí)現(xiàn),并且不保存在與*.ascx文件相同的目錄下,而是與CommunityServerBlogs中其他業(yè)務(wù)邏輯一起編譯為CommunityServer.Blogs.dll)。同時UI項(xiàng)目中還保存了Languages文件與一些配置文件等。

        d: DataProvider,目前只實(shí)現(xiàn)了SqlDataProvider,對SQL Server數(shù)據(jù)庫進(jìn)行操作。DataProvider實(shí)際上是對b 部分中實(shí)體項(xiàng)目數(shù)據(jù)庫操作抽象的具體實(shí)現(xiàn)。數(shù)據(jù)操作的Provider方式帶來幾個好處,不關(guān)心具體實(shí)現(xiàn)、支持多數(shù)據(jù)庫、有利于團(tuán)隊(duì)協(xié)作分工等。

        2、三層構(gòu)架

        在CommunityServerBlogs、CommunityServerForums、CommunityServerGalleries等幾個項(xiàng)目中都采用了三層構(gòu)架,如下圖:

        按此在新窗口打開圖片

        業(yè)務(wù)邏輯是穿插在Contorls與Components中,在單獨(dú)的一個項(xiàng)目中Contorls與Components體現(xiàn)在namespace里,下面以CommunityServerGalleries項(xiàng)目為例講述一下具體項(xiàng)目的三層結(jié)構(gòu):

        按此在新窗口打開圖片

        為了便于文件的管理,項(xiàng)目中建立了Components與Contorls文件夾分別存放名字空間為 CommunityServer.Galleries.Components與CommunityServer.Galleries.Controls。如果你是一個初學(xué)者或者對三層結(jié)構(gòu)不是太了解,可能很多時候你會對三層構(gòu)架感到困惑,其實(shí)這個層的概念沒有絕對的劃分界限,更不是用類作為最小的單位。這種劃分是相對的,是一種為編寫代碼功能的劃分。CommunityServerGalleries項(xiàng)目中沒有直接編寫對數(shù)據(jù)庫的操作代碼,而是使用了 Provider的方式把操作的方法進(jìn)行抽象:

        例:public abstract Hashtable GetGalleries(bool mergePermissions);

        抽象后的代碼可以和普通方法一樣被業(yè)務(wù)邏輯調(diào)用,由于使用了Provider的方式,使得數(shù)據(jù)層與業(yè)務(wù)層之間是松散耦合的,可以很容易的進(jìn)行數(shù)據(jù)庫更換(只需要更換對抽象數(shù)據(jù)操作類的具體實(shí)現(xiàn)方法,而不會影響到業(yè)務(wù)邏輯層的代碼)。

        業(yè)務(wù)邏輯包括幾個部分:CommunityServer.Galleries.Components下所有的實(shí)體類,這些實(shí)體類大多數(shù)通過繼承Post、 IThread、PermissionBase等在CommunityServerComponents項(xiàng)目中定義過或者申明過的類與接口。 CommunityServer.Galleries命名空間下的一些類,這些類用來處理業(yè)務(wù)邏輯運(yùn)行過程中的數(shù)據(jù),同時進(jìn)行緩存和過濾等操作(過濾操作是通過在CommunityServerComponents項(xiàng)目中的CSApplication.cs類下定義委托與事件完成的,要理解這個過程需要對 CS有一定的了解,后續(xù)我會做一個CS中委托與事件的專題)。還有一部分業(yè)務(wù)邏輯混淆在 CommunityServer.Galleries.Controls命名空間下的一些類中,他們與UI表示層較為緊密,你很難準(zhǔn)確的定義他們是屬于業(yè)務(wù)邏輯還是表現(xiàn)層代碼。

        CS中表示層中的類大致可以分為三部分,1:是需要*.ascx的直接處理用戶界面或者用戶輸入輸出的代碼,這些類都間接的繼承CommunityServerControls項(xiàng)目中的TemplatedWebControl類。2:要進(jìn)行換膚就少不了使用一些輔助的類,這些類提供一些基礎(chǔ)服務(wù),如:找到*.cs文件對應(yīng)*.ascx所在路徑等。3:是不需要*.ascx的用戶自定義控件,一般繼承自.Net提供的 WebControls。這些類被放入Controls/Utility文件夾下面。

        傳統(tǒng)的Asp.net Web頁面設(shè)計時在建立 *.aspx或者*.ascx都會同時建立一個同名的*.cs文件,用來實(shí)現(xiàn)對頁面中控件的操作,頁面這個時候就像一個容器。通過Codebehind頁面在運(yùn)行時會自動找到對應(yīng)的類(這個過程如何實(shí)現(xiàn)沒有去分析過,但是我們可以通過反射達(dá)到同樣的效果,同時可以獲得更高的靈活性)。CS系統(tǒng)中的UI就是通過反射尋找到*.ascx對應(yīng)的類從而實(shí)現(xiàn)相應(yīng)的UI處理函數(shù),而*.ascx只要保持名稱和內(nèi)容中控件的ID不變,具體Html代碼如何更換并不影響到整個系統(tǒng)的功能,CS系統(tǒng)也正是通過這樣的手段達(dá)到換膚的目的,同時加入MasterPage又可以減少Html代碼中重復(fù)部分。最后Html與CSS 樣式表的結(jié)合你就可以很容易改變網(wǎng)站的皮膚的樣式,包括文字樣子和div的布局了。*.cs與*.ascx文件剝離后網(wǎng)站美工與程序設(shè)計人員就真正的分開了,有利于團(tuán)隊(duì)協(xié)作,發(fā)揮個人特長。

        還有一點(diǎn)必須說明:在CS項(xiàng)目中很多*.aspx文件只是一個加入了MasterPage的框架頁,甚至是一個什么都沒有的空文件(如多數(shù)default.aspx頁面),框架文件中嵌入了大量的類似于“<Galleries: GalleryAdmin id="GalleryAdmin" runat="server" />”這樣的控件,其實(shí)這個控件對應(yīng)于Skin- GalleryAdmin.ascx的皮膚。如果你能理解到這里,想看明白CS的大部分代碼應(yīng)該不會有問題。

        3、數(shù)據(jù)庫構(gòu)架

        先看一下DataProvider模型:

        按此在新窗口打開圖片

        模型中可以看出抽象的DataProvider是與具體的數(shù)據(jù)庫操作DataProvider分離的,在CS中Components與抽象的 DataProvider被編譯在一個項(xiàng)目中,而SQL Server DataProvider則被單獨(dú)的編譯出來。好處都可以看到那就是更換不同的 DataProvider抽象實(shí)現(xiàn)不同的數(shù)據(jù)庫操作,另外這種松散耦合的方式有利于團(tuán)隊(duì)開放。如何實(shí)現(xiàn)這樣的DataProvider方式呢(我這里簡述一些,具體的請關(guān)注后續(xù)的專題)?

        先看抽象類,抽象類被存放在相應(yīng)項(xiàng)目的Providers目錄下,以Gallery項(xiàng)目為例子,它的命名空間是CommunityServer.Galleries.Components


        按此在新窗口打開圖片
        整個類都是public abstract class,這個很好理解,其實(shí)關(guān)鍵的是在“Instance”

        部分,在 Instance里通過調(diào)用CommunityServerComponents項(xiàng)目DataProviders.cs類中的CreateInstance方法初始化一個GalleryDataProvider。

        過程是先在Communityserver.config文件中找到

        public static readonly string GalleryDataProviderName = "GalleryDataProvider";

        中的“GalleryDataProvider”,這里為:

        <add  name = "GalleryDataProvider" type = "CommunityServer.Data.GallerySqlDataProvider, CommunityServer.SqlDataProvider" connectionStringName = "SiteSqlServer" databaseOwnerStringName = "SiteSqlServerOwner"    />

        根據(jù)“type”中的內(nèi)容,運(yùn)用Type.GetType與Activator.CreateInstance把 CommunityServer.SqlDataProvider.dll程序集中對應(yīng)的 CommunityServer.Data.GallerySqlDataProvider類實(shí)例化,實(shí)例化后類似 GalleryDataProvider.Instance().GetGalleries(true)的調(diào)用其實(shí)就是直接操作 CommunityServer.SqlDataProvider.dll程序集中 CommunityServer.Data.GallerySqlDataProvider類下的

        public override Hashtable GetGalleries(bool mergePermissions)方法。這個過程可能比較難理解,但是理解只是時間問題。

        數(shù)據(jù)訪問層的中與數(shù)據(jù)庫最緊密接觸的就是SqlDataProvider(SqlDataProvider是對SQL Server數(shù)據(jù)庫操作抽象的實(shí)現(xiàn),你也可以對其他數(shù)據(jù)庫進(jìn)行抽象實(shí)現(xiàn),目前CS只提供SQL Server實(shí)現(xiàn)),在SqlDataProvider里使用的是對存儲過程的操作而沒有使用 SQL Text。在前一片專題中我寫過這個做的好處,這里不再多說。主要說明的是對數(shù)據(jù)的緩存與序化:

        緩存:我個人習(xí)慣是把緩存寫在數(shù)據(jù)層里,而CS是把緩存管理寫在業(yè)務(wù)邏輯層中,而且緩存的數(shù)量是很大的,如對CommunityServerGalleries項(xiàng)目中的讀取單個Gallery方法:

        public static Gallery GetGallery(string applicationKey, bool cacheable)

        一般的做法是為這個方法寫一個存儲過程,然后當(dāng)有數(shù)據(jù)操作的時候從數(shù)據(jù)庫中調(diào)用相關(guān)數(shù)據(jù),同時根據(jù)參數(shù)是否緩存數(shù)據(jù),這看起來很好。我也總是覺得內(nèi)存寶貴,能少緩存一點(diǎn)就少緩存一點(diǎn),但是CS的做法是把全部Gallery讀入Hashtable,緩存掉!要讀取單個Gallery的時候從緩存中找,根本不去管數(shù)據(jù)庫,更不要寫存儲過程(這倒是很方便)。當(dāng)然了,CS中是對緩存定義了時間的。時間到期后緩存就自動被釋放了,但是在緩存釋放之前新的數(shù)據(jù)是不會被顯示出來的,對于一些更新不是很快的數(shù)據(jù)集來說這算是一種比較好的解決方案(在SQL 2005中有更好的緩存解決方法,可以在新數(shù)據(jù)更新時更新緩存)。

        數(shù)據(jù)序化:開發(fā)過CRM的朋友應(yīng)該都有體會,很多字段需要預(yù)留在數(shù)據(jù)庫中,因?yàn)槟悴涣私馐褂肅RM系統(tǒng)的客戶會有一些什么樣的存儲要求,如:CRM用戶需要保存他客戶的年齡,但是CRM系統(tǒng)設(shè)計過程中不可能為這樣一個問題特意的加入這個存儲字段,通常的做法是給一些空字段,用戶使用的時候相應(yīng)的對他進(jìn)行初始化。但是導(dǎo)致的結(jié)果就是CRM的數(shù)據(jù)庫慘不忍睹。更可怕的是,如果要進(jìn)行軟件升級的時候如果需要添加一些原本沒有的字段,非常的麻煩,從實(shí)體類到數(shù)據(jù)庫操作的存儲過程都需要更改。而數(shù)據(jù)序化可以解決這個問題,其實(shí)當(dāng)我第一次看到CS這種做法的時候是非常興奮的:第一,實(shí)現(xiàn)了添加字段不需要重新寫數(shù)據(jù)操作類,更不需要對相關(guān)的存儲過程進(jìn)行修改。第二,存儲的字段很工整,全部值都保存在兩個字段中,如圖:


        按此在新窗口打開圖片

        先分析一下存儲的數(shù)據(jù),首先是PropertyNames字段,“EnableComments:S:0:4:ModerateComments:S:4: 5:EnableRatings:S:9:4:” “EnableComments”其實(shí)是在實(shí)體類中定義的一個屬性名稱,“:”表示定義完畢,“S: 0:4”表示在PropertyValues字段中的字符從0開始后面4位屬于“EnableComments”的屬性值,同理:“S:4:5”表示,從第四個字符開始,后面5個表示“ModerateComments”的屬性值,以此類推可以獲得PropertyNames所有的字段的值。(記得在 Asp.net Forums時數(shù)據(jù)的序化是用Binary存儲的,在CS中改為ntext可以對其進(jìn)行搜索,解決序化后的數(shù)據(jù)搜索不便的問題。),關(guān)于如何進(jìn)行序化等后續(xù)專題加以敘述。

        在CS的最底層就是數(shù)據(jù)庫和存儲過程了,關(guān)鍵的幾個表cs_Groups、cs_Sections、 cs_Threads和cs_Posts表分別對應(yīng)于CommuntyServer.Components命名空間下的Group、Section、 Thread和Post類,Groups是分組,對應(yīng)論壇來說就是“板塊組”、版塊”、“線索”和“帖子”,對應(yīng)于Blog就是“博客分組”、“博客” “線索”、“隨筆或者文章”。這個cs_Threads有點(diǎn)難理解,其實(shí)它是對相應(yīng)Section下的Post相關(guān)信息的統(tǒng)計與跟蹤,如最后回帖時間、評論總數(shù)等等。

        上面大致分析了Community Server項(xiàng)目的體系結(jié)構(gòu),細(xì)節(jié)部分會在后續(xù)的專題中一一的分析。不管怎么說Community Server是一個相對龐大的工程,要完全的講解與系統(tǒng)的分析還需要很多的文字。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Community Server專題二:體系結(jié)構(gòu)

        Community Server專題二:體系結(jié)構(gòu):Community Server專題二:體系結(jié)構(gòu)在進(jìn)行CS細(xì)節(jié)分析的之前,有必要先了解CS工程(解決方案)的組成,以及組成CS工程中項(xiàng)目的結(jié)構(gòu),本文分為三個部分:1、工程結(jié)構(gòu) 2、三層構(gòu)架 3、數(shù)據(jù)庫構(gòu)架。1:工程結(jié)構(gòu)=538) {this.width=538;} borde
        推薦度:
        標(biāo)簽: server 二: community
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 1000部羞羞禁止免费观看视频| 一级大黄美女免费播放| 久久久久免费看成人影片| 国产亚洲自拍一区| 国产精品美女久久久免费| 免费一级毛片免费播放| 看成年女人免费午夜视频| 日本高清色本免费现在观看| 国产精品亚洲综合天堂夜夜| 免费欧洲美女牲交视频| 香蕉视频在线观看免费| 久久久久亚洲精品无码网址| 久久毛片免费看一区二区三区| 久久亚洲中文字幕精品一区| 四虎国产精品免费永久在线| 国产∨亚洲V天堂无码久久久| 国产猛男猛女超爽免费视频| 国产亚洲漂亮白嫩美女在线| 国产一区视频在线免费观看 | 亚洲精品人成在线观看| 最近2022中文字幕免费视频| 亚洲中字慕日产2021| 四虎影院免费在线播放| 成人免费夜片在线观看| 久久精品国产亚洲沈樵| 国产福利视精品永久免费| 亚洲狠狠色丁香婷婷综合| 亚洲国产精品成人久久蜜臀| 中文字幕乱码一区二区免费| 亚洲综合激情六月婷婷在线观看 | 亚洲精品456人成在线| 免费看国产精品麻豆| 99麻豆久久久国产精品免费 | 亚洲无码日韩精品第一页| a毛片全部播放免费视频完整18| 亚洲最大视频网站| 国产无遮挡吃胸膜奶免费看视频| 中文字幕免费视频精品一| 亚洲电影在线免费观看| 免费女人18毛片a级毛片视频| 无码AV片在线观看免费|