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

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



CS工程主要分為4個(gè) " /> 欧美v1deossexo高清,2012中文字幕手机在线,伊人久久综合

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

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

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

按此在新窗口打開圖片

CS工程主要分為4個(gè)部分

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)目中幾乎不包含邏輯代碼,只是簡(jiǎn)單的Html與對(duì)運(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)。同時(shí)UI項(xiàng)目中還保存了Languages文件與一些配置文件等。

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

2、三層構(gòu)架

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

按此在新窗口打開圖片

業(yè)務(wù)邏輯是穿插在Contorls與Components中,在單獨(dú)的一個(gè)項(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。如果你是一個(gè)初學(xué)者或者對(duì)三層結(jié)構(gòu)不是太了解,可能很多時(shí)候你會(huì)對(duì)三層構(gòu)架感到困惑,其實(shí)這個(gè)層的概念沒有絕對(duì)的劃分界限,更不是用類作為最小的單位。這種劃分是相對(duì)的,是一種為編寫代碼功能的劃分。CommunityServerGalleries項(xiàng)目中沒有直接編寫對(duì)數(shù)據(jù)庫(kù)的操作代碼,而是使用了 Provider的方式把操作的方法進(jìn)行抽象:

例:public abstract Hashtable GetGalleries(bool mergePermissions);

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

業(yè)務(wù)邏輯包括幾個(gè)部分:CommunityServer.Galleries.Components下所有的實(shí)體類,這些實(shí)體類大多數(shù)通過繼承Post、 IThread、PermissionBase等在CommunityServerComponents項(xiàng)目中定義過或者申明過的類與接口。 CommunityServer.Galleries命名空間下的一些類,這些類用來處理業(yè)務(wù)邏輯運(yùn)行過程中的數(shù)據(jù),同時(shí)進(jìn)行緩存和過濾等操作(過濾操作是通過在CommunityServerComponents項(xiàng)目中的CSApplication.cs類下定義委托與事件完成的,要理解這個(gè)過程需要對(duì) CS有一定的了解,后續(xù)我會(huì)做一個(gè)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文件對(duì)應(yīng)*.ascx所在路徑等。3:是不需要*.ascx的用戶自定義控件,一般繼承自.NET提供的 WebControls。這些類被放入Controls/Utility文件夾下面。

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

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

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

先看一下DataProvider模型:

按此在新窗口打開圖片

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

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


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

部分,在 Instance里通過調(diào)用CommunityServerComponents項(xiàng)目DataProviders.cs類中的CreateInstance方法初始化一個(gè)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程序集中對(duì)應(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)方法。這個(gè)過程可能比較難理解,但是理解只是時(shí)間問題。

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

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

public static Gallery GetGallery(string applicationKey, bool cacheable)

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

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


按此在新窗口打開圖片

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

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

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

AspNet技術(shù)Community Server專題二:體系結(jié)構(gòu),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 天天日免费观看视频一1 | 91亚洲精品福利在线播放 | 亚洲日韩天堂在线中文字幕 | 蜜桃精品成人影片 | 亚洲精品乱码一区二区三区 | 欧美特黄三级成人 | 国产综合无码一区二区色蜜蜜 | 邓奴的视频IVK | 国产精品久久久久久精品... | 久久久久久免费高清电影 | 蜜臀AV999无码精品国产 | 亚洲二区电影 | 成人人猿泰山 | 诱受H嗯啊巨肉各种play | 成人免费在线视频 | 日本电影小姐 | 1024人成网站色www下载 | 国产午夜免费不卡精品理论片 | 九热这里只有精品 | 亚洲国产在线精品第二剧情不卡 | 亚洲精品无码不卡在线播HE | 亚洲高清无在码在线无弹窗 | 色播成人影院 | 久久久精品久久久久久 | 成人在线免费视频 | 欧美一区二区在线观看 | 手机看片国产日韩欧美 | 男人和女人全黄一级毛片 | 少妇第一次交换 | 久久精品热在线观看85 | 俄罗斯美女性生活 | 亚洲电影成人 成人影院 | 极品少妇高潮啪啪AV无码 | 麻豆成人啪啪色婷婷久久 | 97色伦图片97色伦图影院久久 | 榴莲推广APP网站入口下载安装 | 久久精品麻豆国产天美传媒果冻 | 99午夜高清在线视频在观看 | 少妇厨房愉情理9伦片视频 少妇被躁爽到高潮无码久久 | 久久中文字幕亚洲 | 热九九99香蕉精品品 |