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

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進Linq-Linq to SQL How do I(1)

走進Linq-Linq to SQL How do I(2)

走進Linq-Linq to SQL How do I(3)

走進Linq-How do I(4)拾遺補零篇第一節

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


話說Linq to SQL理論上應該支持多種數據庫的,而且應該支持多種數據庫,到最后卻落的這個局面,是為了商業考慮還是本來技術就不成熟?不得而知。不過不管怎么說Linq to SQL的體系結構確實是支持擴展的。

在System.Data.Linq.Mapping這個命名空間下微軟提供了一個特性:ProviderAttribute,使用強類型的DataContext或使用Xml做映射的時候,該特性可以用來指定具體的數據庫提供者。如下:

[Database(“dbo.cnblogs”)]
[Provider(
typeof(SqlProvider))]
Public CnBlogDataContext : DataContext
{

}

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進Linq-Linq to SQL How do I(1)

走進Linq-Linq to SQL How do I(2)

走進Linq-Linq to SQL How do I(3)

走進Linq-How do I(4)拾遺補零篇第一節

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


關于設計模式的旁白

橋接模式

看到這里也許大家都說,哦,原來實際的事情都是這個IProvider干的啊,IProvide是個接口,下面可能有SqlProvider,OracleProvider,AccessProvider,只要提供這些Provider我們就可以無限擴展數據庫了。是的,設計到這一步已經可以滿足多數據庫的要求了,但是數據庫種類的多樣性只是一個方面,還有每種數據庫版本的差異呢?如果我們就使用繼承,就這樣無限的去擴展,最后會得到一個很復雜的類層次,層次搞復雜后不僅僅難于重構,更要的是會出現很多重復,靈活性也降低了。

如果光使用繼承,我們可能會得到這樣的繼承樹:

這樣的繼承層次看起來貌似很“專業”,但是靈活性實在是不敢恭維,首先,任何一個層次的小小變動在整個繼承鏈上都要改動,如果增加一種數據庫,而這種數據有會有幾種版本,各個版本之間又有些差異,那么類的數量會成倍增長。還有一個,那就是子類之間有可能造成重復,假如Sql2000Provider和Oracle9iProvider之間有重復怎么辦?C#又不支持多繼承,我們無法使用Martin Folwer的重構方法將子類重復的部分提升到父類。那有什么好辦法呢?看看微軟的設計師是怎么干的。

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

不能不說的C#特性-匿名類型與隱式類型局部變量

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

不能不說的C#特性-迭代器(下),yield以及流的延遲計算

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

走進Linq-Linq to SQL How do I(1)

走進Linq-Linq to SQL How do I(2)

走進Linq-Linq to SQL How do I(3)

走進Linq-How do I(4)拾遺補零篇第一節

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


IProvder的初始化方法Initialize需要兩個參數,其中一個就是一個IDataService接口(注意,這里是接口,那肯定有很多實現,不過由于Linq to SQL就支持一種數據庫,現在也只有一種實現了,不過我們可以通過這種形式來想象和擴展,并可以學習這種理念),這個時候我們得到的是另外一種類圖:

這里以組合的方式,組合Provider和IDataService,類的繼承層次簡明了很多,也可以很容易處理子類之間的重復了。

實際上這就是橋接模式,該模式的意圖是抽象和實現相分離,在這里IProvider就是抽象,而IDataService這邊就是實現了。通過IDataService這個接口,把SqlProvider和CommonDataService,DBProvider和DBDataService之間的依賴消除了。仔細體會一下,我們的實際項目中在哪些地方出現過這樣的場景?不久以前我發了一篇博客《重構到Brdge模式》,那里描述了我實際項目中一個真實的場景。

請注意的是,實際的Linq to SQL因為只支持SQL Server,所以上面的類圖描述的關系并不存在,但是我們從代碼中完全可以想象的到即使要擴展也是很容易的,這就是架構的力量,即使是昨天的設計也能應付明天的變化。

關于Provider的初始化就介紹到這里了,在文章末尾的源代碼下載里提供了IProvider類和SqlProvider類,你可以看看初始化的過程,并聯系上面的圖想想如何構建一個可擴展的架構。


Linq to SQL源代碼下載,注意不是完整源代碼,不能通過編譯,我會逐漸增加源代碼

it知識庫走進Linq-Linq to SQL源代碼賞析之Provider的初始化,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产视频精品在线偷拍 | 乱淫67194| 哪里能看毛片 | 九九精品在线播放 | 高清国产免费观看视频在线 | 一级毛片两人添下面 | 免费看男人J放进女人J无遮掩 | 男人J桶女人P视频无遮挡网站 | 超碰在线视频人人AV | 四虎永久在线精品国产免费 | 国产免费看黄的私人影院 | 亚洲成片在线看 | 色综合久久88色综合天天提莫 | 在线国内自拍精品视频 | 国产av在线看的 | 久久精麻豆亚洲AV国产品 | 日本学生VIDEOVIDEOS更新 日本性xxx | 日本邪恶全彩工囗囗番海贼王 | fryee性欧美18 19| 国产亚洲精品黑人粗大精选 | 伊人色综合久久天天 | 草久热的视频在线观看 | 亚洲在线中文无码首页 | 国产成人综合高清在线观看 | 99久久精品6在线播放 | 国产 亚洲 中文字幕 在线 | 国厂精品114福利电影 | 欧美性受xxxx狂喷水 | 久久机热视频 这里只有精品首页 | 久久视频这只精品99re6 | 97国产人妻精品无码AV在线 | 中文字幕在线观看网址 | AV亚洲精品少妇毛片无码 | 亚洲成人99 | 且试天下芒果免费观看 | 宅男午夜大片又黄又爽大片 | 精品视频免费在线观看 | 亚洲免费人成 久久 | 国产精品久久久久激情影院 | 8050午夜二级一片 | 蜜桃久久久亚洲精品成人 |