天天看點

依賴屬性之“風雲再起”一. 摘要二. 本文提綱三. 兵馬未動,廢話先行四. 依賴屬性續前緣

· 1.摘要 · 2.本文提綱 · 3.兵馬未動、廢話先行 · 4.依賴屬性續前緣 · 5.引入測試驅動開發 · 6.DependencyProperty測試代碼 · 7.DependencyProperty實作代碼 · 8.DependencyObject測試代碼 · 9.DependencyObject實作代碼 · 10.PropertyMetadata測試代碼 · 11.PropertyMetadata實作代碼 · 12.其他協助類測試代碼 · 13.其他協助類的實作代碼 · 14.回歸并統計覆寫率 · 15.簡單驗證依賴屬性系統 · 16.本文總結 · 17.相關代碼下載下傳 · 18.系列進度

在講這篇文章之前,我們先來拉一拉家常,說點題外話,就當進入正餐之前的一些甜點,當然這裡主要針對.NET平台而言:

  網際網路的普及應用催生了很多技術的發展與更新,如果仔細深究,你會發現軟體技術的發展趨勢将主要展現在以下四個方面:用戶端軟體開發(其中包括 用戶端軟體、遊戲、中間件和嵌入式開發等)、Web 開發(包括傳統的Web技術、Web遊戲以及一些線上應用)、移動裝置軟體開發(主要涉及到手機等移動裝置)、雲計算開發(公有雲、私有雲、混合雲會逐漸 界限清晰,雲廠商以及雲平台也會逐漸整合和成熟起來)。就微軟來說,這四個方面主要如下:

  目前微軟主要有Win32 應用程式、MFC 應用程式、WinForm應用程式和WPF 應用程式作為開發選擇,目前這四種技術還會共存,因為不同的需求以及不同的人群都有不同的需要。當然WPF借助于其強大的功能和迅猛的發展速度很快會成為 首選,這個是值得肯定的。   在WEB方面微軟主要有ASP.NET、ASP.NET MVC、Silverlight三種技術,ASP.NET技術已經發展了多年,在未來的很長一段時間内還會是主流,同時結合Silverlight作為局 部和整體應用效果都還很不錯,是以這也是很多企業的首選。ASP.NET MVC在目前來說應用還不是特别廣泛,不過用過之後感覺也還不錯,隻是還需要一段時間的适應過程而已。Silverlight在建構局部應用和整站應用都 發揮了不錯的優勢,在Windows Phone中也表現得不錯,是以這個技術将會一直熱下去。   移動裝置方面可謂是現在衆廠商競争最激烈的市場之一,也是傳統技術和新型技術的主要戰場之一。微軟現在主推的Windows Phone開發主要包括Silverlight和XNA兩種技術,Windows Phone開發逐漸變得和ASP.NET開發一樣簡單,這也是微軟的一個目标。   雲計算現在基本上成了網際網路的第一大熱門詞,不管是軟體為主導的企業,還是以硬體為主導的企業,都卷入了這場紛争與革命。微軟的雲平台—— Windows Azure Platform,它是微軟完整的雲計算平台,目前包含了如下三大部分(Windows Azure:運作在雲中的作業系統,對于使用者來說是虛拟且透明的,其中提供了Compute(計算),Storage(存儲),以及Manage(管理) 這三個主要功能及其底層服務,使用起來相當的便捷。SQL Azure:運作于雲中的一個關系資料庫,和SQL Server 2008類似,但是在功能上還沒有那麼強大。AppFabric:全名是Windows Azure platform AppFabric,提供了通路控制、服務總線等服務,主要用于把基礎應用連接配接到雲中)。

其實把這四個方面總結起來就是傳說中的微軟“三屏一雲”戰略,從中也可以看出微軟逍遙于天地,縱橫于宇内,嘯傲于世間,雄霸于大地的枭雄戰略!

  在談之前我們先看一下什麼是MONO?MONO項目是由Ximian發起、Miguel de lcaza上司、Novell公司主持的項目。它是一個緻力于開創.NET在Linux,FreeBSD,Unix,Mac OS X和Solaris等其他平台使用的開源工程。它包含了一個C#語言的編譯器,一個CLR的運作時,和一組類庫,并逐漸實作了 ADO.NET、ASP.NET、WinForm、Silverlight(可惜沒有實作強大的WPF),能夠使得開發人員在其他平台用C#開發程式。

1,跨平台:開創.NET在Linux,FreeBSD,Unix,Mac OS X和Solaris等其他平台使用,這是微軟沒有實作的,但是MONO進行了補充,是以值得看好。 2,開源:不論使用什麼技術,大家似乎都希望能夠用開源的産品,一方面是考慮到技術的可控性和可維護性;另一方面則是考慮到安全性,當然在另一個角度也是可以學習到其中的一些技術和思想,是以大家對開源總是報以歡迎的态度。 3,不同的方式實作.NET架構:由于微軟對技術申請了專利,是以MONO不能盲目的模仿,對很多細節都改用自己的方式進行了實作,是以我們也可以學到很多不一樣的實作方式。 4,持續更新:MONO從一開始到現在始終在更新,其中包括bug修複、版本更新、增加新的功能及應用,是以相信它會在不斷的更新中更加完善。
1.模仿但要避免專利:由于是模仿微軟.NET平台,但因為微軟對代碼申請了專利,是以MONO隻能采用其它實作方式來實作同樣的功能,這樣一來很多地方就會實作得很累贅,效率也會受損。 2.沒有擺脫實驗産品的頭銜:由于它目前的使用比較低,是以資訊回報和持續改進就做得比較弱,這也是目前功能完善得比較慢的原因之一吧。 3,功能還需要完善:一些主要功能還未實作,如作為Windows平台最基礎的COM和COM+功能沒有儲存,像MSMQ等消息隊列,消息傳送的功 能也沒有實作,對ADO.NET、XML等核心功能效率有待提升,對BCL庫代碼也有很多需要優化的地方,強大的WPF也沒有引入。 4.效率和使用者體驗還有待提升。

微軟與MONO之間的關系也一直處于不冷不熱的狀态,沒有明确的反對,也沒有明确的支援,究其原因筆者認為主要有以下兩點:

1,微軟帶來最大收益的産品仍舊是Windows作業系統和Office等軟體,微軟在其他領域盈利都沒有這兩大産品來得直接。而.NET作為微軟 的強大開發平台,是不希望落在其他平台上運作的,這樣就會削弱Windows作業系統和Office等軟體的市場占有率,是以讓.NET跨平台對微軟來說 是一件舍本求末的事情,這也是微軟不主張.NET運作于其他平台的主要原因,你想微軟是一個以技術為主導的公司,任何IT市場都會有它的身影,如果想 讓.NET跨平台,那豈不是一件很輕而易舉的事情嗎? 2,由于MONO還沒有成熟,在很多方面都表現得像一個實驗室産品,在根本上沒有對微軟構成威脅,況且在外界質疑.NET是否能跨平台的時候,還有一個現身的說法,是以微軟也不會明确的反對和支援。

  雖然目前來說MONO喜憂參半,但優點始終要大于缺點,畢竟每一個架構或者産品都是慢慢不斷改進而完善的,更何況開源必将是未來的一個趨勢,是以我們有理由也有信心期待它接下來的發展。

  大家都有一個共識:如果你想研究某個架構或者工具的源碼,那先必須熟練使用它,熟練之後自然就有一種研究它的沖動,但是往往這個架構或工具比較 龐大,很不容易下手,一個很不錯的方法就是使用TDD。我們都知道TDD的基本思想就是在開發功能代碼之前,先編寫測試代碼。也就是說在明确要開發某個功 能後,首先思考如何對這個功能進行測試,并完成測試代碼的編寫,然後編寫相關的代碼滿足這些測試用例。然後循環進行添加其他功能,直到完全部功能的開發, 在此過程中我們可以借助一些工具來協助。比如我們現在要研究Nhibernate,那麼我們首先要熟練它的一些功能,然後從一個點出發慢慢編寫單元測試, 然後逐漸完善代碼,最後直至完成架構的搭建,這樣會給我們帶來莫大的驅動力和成就感。除了微軟的BCL(Base Class Library)和企業庫以外,大家還可以用TDD來試試還原以下的任一開源代碼:

  大家都知道WPF和Silverlight帶來了很多新的特性,其中一大亮點是引入了一種新的屬性機制——依賴屬性。依賴屬性基本應用在了 WPF的所有需要設定屬性的元素。依賴屬性根據多個提供對象來決定它的值(可以是動畫、父類元素、綁定、樣式和模闆等),同時這個值也能及時響應變化。所 以WPF擁有了依賴屬性後,代碼寫起來就比較得心應手,功能實作上也變得非常容易了。如果沒有依賴屬性,我們将不得不編寫大量的代碼。依賴屬性在WPF中 用得非常廣泛,具體在以下幾個方面中表現得尤為突出:

◆ UI的強大屬性體系 ◆ Property value inheritance(值繼承) ◆ Metadata(強大的中繼資料) ◆ 屬性變化通知,限制、驗證 ◆ Resources(資源) ◆ Data binding(資料綁定) ◆ Styles、Template(樣式、模闆和風格) ◆ 路由事件、附加事件、附加行為乃至指令 ◆ Animations、3D(動畫和3D) ◆ WPF Designer Integration(WPF設計、開發內建)

  在上一篇WPF基礎到企業應用系列7——深入剖析依賴屬性中,我們對依賴屬性做了較詳細的介紹,那麼下面我們就簡單回顧一下,其實依賴屬性的實作很簡單,隻要做以下步驟就可以實作:

◆ 第一步: 讓所在類型繼承自 DependencyObject基類,在WPF中,我們仔細觀察架構的類圖結構,你會發現幾乎所有的 WPF 控件都間接繼承自DependencyObject類型。  ◆ 第二步:使用 public static 聲明一個 DependencyProperty的變量,該變量才是真正的依賴屬性 ,看源碼就知道這裡其實用了簡單的單例模式的原理進行了封裝(構造函數私有),隻暴露Register方法給外部調用。  ◆ 第三步:在靜态構造函數中完成依賴屬性的中繼資料注冊,并擷取對象引用,看代碼就知道是把剛才聲明的依賴屬性放入到一個類似于容器的地方,沒有講實作原理之前,請容許我先這麼陳述。  ◆ 第四步:在前面的三步中,我們完成了一個依賴屬性的注冊,那麼我們怎樣才能對這個依賴屬性進行讀寫呢?答案就是提供一個依賴屬性的執行個體化包裝屬性,通過這個屬性來實作具體的讀寫操作。

根據前面的四步操作,我們就可以寫出下面的代碼:

  通過上面的例子可以看出,我們一般.NET屬性是直接對類的一個私有屬性進行封裝,是以讀取值的時候,也就是直接讀取這個字段;而依賴屬性則是 通過調用繼承自DependencyObject的GetValue()和SetValue來進行操作,它實際存儲在 DependencyProperty的一個IDictionary的鍵-值配對字典中,是以一條記錄中的鍵(Key)就是該屬性的HashCode值, 而值(Value)則是我們注冊的DependencyProperty。 回顧了一些基礎知識,那我們下面就開始今天的依賴屬性系統TDD之旅。

本文轉自KnightsWarrior51CTO部落格,原文連結: http://blog.51cto.com/knightswarrior/405225,如需轉載請自行聯系原作者

繼續閱讀