在進(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è) " /> 黄页视频在线免费观看,久久综合一本,日韩一区二区三区中文字幕

四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

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

Community Server專(zhuān)題二:體系結(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)

按此在新窗口打開(kāi)圖片

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

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

b: CommunityServerBlogs、CommunityServerForums、CommunityServerGalleries、 CommunityServerDocuments、CommunityServerGuestBook。這些項(xiàng)目都是通過(guò)繼承、調(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文件,但沒(méi)有關(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方式帶來(lái)幾個(gè)好處,不關(guān)心具體實(shí)現(xiàn)、支持多數(shù)據(jù)庫(kù)、有利于團(tuán)隊(duì)協(xié)作分工等。

2、三層構(gòu)架

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

按此在新窗口打開(kāi)圖片

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

按此在新窗口打開(kāi)圖片

為了便于文件的管理,項(xiàng)目中建立了Components與Contorls文件夾分別存放名字空間為 CommunityServer.Galleries.Components與CommunityServer.Galleries.Controls。如果你是一個(gè)初學(xué)者或者對(duì)三層結(jié)構(gòu)不是太了解,可能很多時(shí)候你會(huì)對(duì)三層構(gòu)架感到困惑,其實(shí)這個(gè)層的概念沒(méi)有絕對(duì)的劃分界限,更不是用類(lèi)作為最小的單位。這種劃分是相對(duì)的,是一種為編寫(xiě)代碼功能的劃分。CommunityServerGalleries項(xiàng)目中沒(méi)有直接編寫(xiě)對(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ù)操作類(lèi)的具體實(shí)現(xiàn)方法,而不會(huì)影響到業(yè)務(wù)邏輯層的代碼)。

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

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

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

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

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

先看一下DataProvider模型:

按此在新窗口打開(kāi)圖片

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

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


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

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

過(guò)程是先在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類(lèi)實(shí)例化,實(shí)例化后類(lèi)似 GalleryDataProvider.Instance().GetGalleries(true)的調(diào)用其實(shí)就是直接操作 CommunityServer.SqlDataProvider.dll程序集中 CommunityServer.Data.GallerySqlDataProvider類(lèi)下的

public override Hashtable GetGalleries(bool mergePermissions)方法。這個(gè)過(guò)程可能比較難理解,但是理解只是時(shí)間問(wèn)題。

數(shù)據(jù)訪問(wèn)層的中與數(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ǔ)過(guò)程的操作而沒(méi)有使用 SQL Text。在前一片專(zhuān)題中我寫(xiě)過(guò)這個(gè)做的好處,這里不再多說(shuō)。主要說(shuō)明的是對(duì)數(shù)據(jù)的緩存與序化:

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

public static Gallery GetGallery(string applicationKey, bool cacheable)

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

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


按此在新窗口打開(kāi)圖片

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

在CS的最底層就是數(shù)據(jù)庫(kù)和存儲(chǔ)過(guò)程了,關(guān)鍵的幾個(gè)表cs_Groups、cs_Sections、 cs_Threads和cs_Posts表分別對(duì)應(yīng)于CommuntyServer.Components命名空間下的Group、Section、 Thread和Post類(lèi),Groups是分組,對(duì)應(yīng)論壇來(lái)說(shuō)就是“板塊組”、版塊”、“線索”和“帖子”,對(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ù)的專(zhuān)題中一一的分析。不管怎么說(shuō)Community Server是一個(gè)相對(duì)龐大的工程,要完全的講解與系統(tǒng)的分析還需要很多的文字。

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

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

主站蜘蛛池模板: 免费看污污的视频| 澳门华侨报| 欧布奥特曼普通版普通话中文版| 四查四看自我剖析材料| 草逼操| 寡妇激情毛片免费视频| 曾生| 女神异闻录5 动漫| 贵阳银行客服电话24小时人工服务| 老友记| 什么水果是热性的| 恩乔| 小学生版《三国演义》| 电影《森林》| 上嘴唇有个黑痣好不好| 白丝带 电影| 古风男头| justin harris| 烽火流金电视剧免费观看| 孙子兵法三十六计完整解释电子书| 在线爱爱视频| 老公看你的| 流浪地球2视频免费播放下载| 水果篮子第二季全集| 一夜风流| 房东电影| 大学生国防论文2000字| 好看电影网站免费看| 舞娘电影在线观看免费完整版电影| 卡特琳娜·格兰厄姆| 八角笼中电影| 十三邀第八季在线观看| 张绍荣| 游泳池电影| 抖音pc端| 孤战迷城电视剧剧情介绍| 出轨幻想| 毒灰| 北京 北京 汪峰歌曲| 夜色斗僵尸| 回到十八岁|