Microsoft技術棧最近有大量的變遷,這使得開發人員和領導者都想知道他們到底應該關注哪些技術。Microsoft自己並不想從官方層面上反對Silverlight這樣的技術,相對而言他們更喜歡讓這種技術慢慢淡出人們的視線,否則局面可能會更加混亂。如果你想了解該問題的答案,那麼可以查看“.NET業務應用程序技術指南”這個小有名氣的文檔。該文檔發布於去年早些時候,它深入探討了Microsoft打算在哪些領域付出努力,我們應該回避哪些技術等內容。
下面這個概要圖是我們探索Microsoft及其相關技術的一個很好的起點。
雖然WinForms和Web表單這些舊的.NET技術依然占有一席之地,但是Silverlight和Flash這樣的RIA容器絕對是出局了。正如下面圖5-15所展示的,Microsoft並不想空等著Silverlight 5所計劃的10年生命周期。他們已經打算在2015年底放棄RIA容器。
高端應用程序更傾向於完全使用本地技術;而低端應用程序則期望HTML5的能力持續發展。盡管沒有將開發人員推向具體的某一種技術,但是對於這種轉變我們必須要注意的事情是:
如果你正在過渡到本地應用,那麼你可以以生來就可以在任何Windows設備上運行的XAML/.NET作為目標,這樣你就能夠利用自己已有的技能甚至是代碼了。可移植類庫還允許你在不同的平台之間共享類庫,包括Silverlight。
對於基於浏覽器的HTML5應用而言,Microsoft提供了主要的工具和框架,它們能夠幫助你基於最新的標准創建可用於任何設備的應用程序。Silverlight和HTML的互操作性還允許你通過混合應用程序進行逐步的過渡。
Windows 8商店有三個相等但是不同的選項
就Windows 8商店應用而言,Microsoft過去一直不願意將開發人員推到某一種具體的技術棧上。這個政策現在也沒有發生變化;在.NET/XAML、C++和JavaScript/HTML5這些技術之間選擇的首要標准是開發人員最熟悉哪種技術。
除此之外,他們還提到了C++,因為它具有性能優勢。可重用性並不是很受關注的一個點,因為這三個平台都能夠在Windows Phone和Windows桌面之間共享代碼和資源。
Windows Phone推薦的技術是.NET和C++。再次重申,需要注意一下C++的性能優勢,但是他們說的最多的還是開發者應該使用自己更加熟悉的技術。
盡管Windows Phone兼容PhoneGap/Apache Cordova,但是這並沒有被提及。推測起來原因可能是他們認為在小設備上PhoneGap的性能比起.NET或者C++要差。在2013年度的Build大會上性能無疑是最重要的話題,超出了諸如一般可用性、可視化設計和深度OS集成等其他話題。
如果你想選擇一種能夠在所有移動設備上運行的、基於Web的解決方案,那麼有多種選擇。使用Modernizer的ASP.NET MVC是基線推薦方案,你能夠使用它創建單頁面應用程序(ASP.NET SPA)。Microsoft對SPA的看法是它更像是一種設計模式而不是技術,同時Microsoft還極力推薦使用Knockout和Breeze這兩個類庫。
為了快速地裝配CRUD風格的應用程序,LightSwitch被列了出來。雖然該框架幾乎沒有對HTML渲染進行控制,但是卻可以讓開發人員不必為各種各樣的屏幕大小構建布局,減少了工作量。
ASP.NET Web頁面是為移動Web提供的第四個選項。它基於Razor語法,為開發者提供了與PHP和傳統ASP等腳本語言相似的開發體驗。
指南中並沒有提及比較老的ASP.NET渲染工具箱——Web表單。雖然該技術依然在積極的開發中,同時從理論上說它也能夠渲染設備特定的HTML,但是在實踐中Web表單並沒有發揮其真正的潛力。它所渲染的HTML和JavaScript好像比較低效,此外其高級功能所必須的view state能快速地壓垮一個手機的網絡連接。
因為大部分應用程序都依賴於外部的數據存儲和處理,所以服務器端開發依然是一個非常重要的考慮因素。Microsoft認為現在有6種可行的技術選項。
根據Microsoft所提供的信息,新項目的默認選擇應該是ASP.NET Web API。如果要開發遵循REST風格的服務,或者需要兼容“Akamai、Windows Azure CDN、Level3等”Internet緩存,那麼可以使用該技術。
開發者在使用Web API的時候應該關注OData和JSON,前者標准化了REST端點的暴露方式。
與Web API相比WCF被認為是一種更加靈活的選項,因為它並沒有與任何特定的傳輸協議或者消息格式綁定。例如,你能夠利用TCP或者命名管道和二進制消息提升性能。缺點是WCF使用起來比較困難,特別是當你想要以JSON或者其他非基於SOAP的格式暴露數據時更是如此。
WCF是面向企業設計的,理念是RPC風格的通信。雖然它也可以使用面向大眾的REST風格的設計模式,但是這並不是該場景下的首選項。
如果你的主要工作是CRUD風格的服務層,同時想要使用WCF技術棧,那麼WCF數據服務是一個不錯的選擇。它與ASP.NET Web API共享OData類庫,並且通常會與Entity Framework結合使用。
Workflow服務是Windows Workflow與WCF的結合。使用它的原因只有一個,那就是你的服務內部已經使用了Windows Workflow。Microsoft認為沒有讓你選擇這個選項的其他原因。
如果你僅想使用基於.NET的客戶端,那麼WCF為良好的雙向通信提供了很多選項。但是如果你想要的是能夠同時支持.NET和基於Web的客戶端,那麼SignalR是一個非常不錯的選擇。
根據Microsoft提供的信息,SignalR甚至能夠擴展到上百萬用戶。Web客戶端喜歡使用WebSockets,但是可以在必要的時候自動地回退到舊的模式,例如長輪詢。
SignalR還有一個針對.NET客戶端的類庫,允許Web和本地客戶端共享服務。
Microsoft對OData的喜愛程度誇張到我們幾乎難以用語言來描述。到現在為止,我們已經看到了用於WCF和Web API的OData,但是這並沒有結束。盡管通常情況下我們使用的是LightSwitch的客戶端,但是很顯然我們還可以使用它的服務器端能力快速地生成一個服務層。
Microsoft宣稱LightSwitch不需要任何編碼,但是同時也警告說這樣會喪失靈活性。
Microsoft為中小型企業編寫指南時一直遵循如下目標:
提高完成速度,縮短上市時間
提高生產效率並降低成本
容易開始
與市場產品的協作和集成
雲計算的靈活性以及降低成本的機會
通俗點說,它的意思就是“讓事情變得更快,成本更低”。Microsoft提供的這個具體的指南取決於你喜歡什麼樣的展示模式。
對於快速而隨意的CRUD風格的應用程序而言,Microsoft推薦的首選平台依然是LightSwitch。LightSwitch最初被描述為一個針對非專業程序員的工具。許多人將它看作是一個訪問的多層替代。但是隨著現在Microsoft更多的將其作為一個服務於需要快速推出應用程序的IT部門的工具,這個願景似乎也已經消失。
接下來要講的是Web表單。是的,令人尊敬的Web表單依然是新項目推薦使用的技術。Microsoft將其看作是一種折中技術,介於易用但是有限制的LightSwitch和復雜的ASP.NET MVC之間。Web表單包含豐富的數據表格等功能,它依然能夠非常好的適用於企業內部的應用程序。
此外還提到了ASP.NET Web頁面,但僅僅是簡單介紹了一下。如果你認為Web表單所提供的渲染能力依然無法滿足自己的需求,那麼可以選擇ASP.NET MVC。但是Microsoft針對其較長時間的學習曲線提出了警告。
雖然所有基於C++的GUI工具集(例如MFC和ATL/WTL)都不在列表上,但是最初的.NET UI工具集WinForms以及WPF依然被認為是可行的選項。這兩者都支持現代的理念,例如數據綁定和async/await,同時都能夠使用WCF或者SignalR進行雙向通信。
在WPF和WinForms之間做出選擇之前需要考慮下面幾點因素:
首先是難度。比起WPF來WinForms更容易理解,甚至對高級開發者也是如此。WinForms使用非常簡單的數據綁定,同時更喜歡傳統的MVC或者MVP機制。而對於WPF而言,用戶在能夠正確地使用MVVP模式之前需要學習一個復雜的數據綁定框架。成功地使用WPF還需要了解資源字典、轉換器、ICommands和XAML模版引擎方面的知識。
另一方面,如果你還打算把Windows Phone或者Windows 8 商店作為目標平台,那麼你需要學習如何使用XAML。在這種情況下,從WPF入手會讓你更有可能在不同的平台之間共享代碼。
查看本欄目
Microsoft在討論依賴注入和控制反轉容器上花費的大量時間簡直令人驚訝。他們列出了9個單獨的控制反轉容器,其中最主要的一個是非附屬於Microsoft的社區運行的項目。應該注意的是,他們列出的許多框架並不是真正意義上的IoC容器,而是依賴注入框架。
Microsoft並沒有在這一部分清晰地表述出自己更喜歡組合根(一種DI模式)還是更喜歡服務定位(一種IoC容器模式),所以用戶對這兩者的疑惑依然存在,這相當令人沮喪,因為正如Mark Seemann所說:他們在本質上是對立的。
Microsoft使用了“單一職責模式”證明依賴注入的使用。例如,他們說SRP可能會導致一個類的構造函數中有15個依賴。為了“解耦”這些依賴,他們建議從構造函數中移除這些依賴,然後使用控制反轉容器進行注入。
Microsoft還提到應使用面向切面的編程添加一些其他的間接層,並且進一步注入依賴。
為了控制復雜性,Microsoft花了幾頁討論“邊界上下文”的概念。據Eric Evans所說,它的基本思想是將應用程序分成更小的部分,各部分之間使用有限的共享。下面的例子有4個獨立的棧,它們使用不同的後端和一個共同的UI。
Microsoft在這一部分的建議非常有道理。對於被識別出來作為關鍵任務的邊界上下文,你可以使用更加昂貴的命令、查詢職責分離(CQRS)或者領域驅動設計(DDD)模式以及完全的自動化測試。同時,輔助性的邊界上下文可以使用輕量級的、CRUD風格的架構。當然,遺留代碼會有它自己的倉庫,在那裡它們會被隔離並被慢慢替代。
如果想要在邊界上下文之間共享信息,那麼Microsoft推薦盡可能地使用異步消息。這樣每個部分就能夠獨立工作,即使某個部分失敗了也不會影響其他部分。對於簡單的場景,命名管道和Microsoft消息隊列是比較容易的選項,而更復雜的系統則需要一個服務總線。Microsoft提到了Windows Server服務總線、Windows Azure服務總線以及NServiceBus,但是並沒有說更喜歡哪一個。
邊界上下文暴露的所有服務都應該有一個防護層對其進行保護。就像應該對參數進行檢查以保護公共函數一樣,邊界上下文的防護層可以讓底層的數據存儲免受畸形消息的侵害。這一層會驗證進入的消息,執行所有必要的轉換,並且確保壞數據會被處理和存儲。用戶可以使用普通的.NET代碼實現,但是對於復雜的、有很多頻繁變化的業務規則的場景,Microsoft推薦使用規則引擎和集成平台,例如BizTalk。
處理遺留代碼的第一步是為其創建一個外觀層。該外觀層應該使用現代的技術,例如持續的、可擴展的緩存,並且應該隱藏舊代碼使用的所有模式。隨著時間的推移,遺留代碼將會被置換,外觀層會被重定向到新的服務層。
Microsoft推薦使用所有的.NET 本地、Web和通信框架,浏覽器端的Silverlight和.NET Remoting除外。在一些場景下他們還推薦使用C++和JavaScript。像VB 6和傳統ASP這樣的舊平台根本沒有被提及,所以依然在使用這些技術的公司應該盡快地遷移到新技術上。
不出所料,Microsoft繼續強調了依賴注入,特別是它們與ASP.NET MVC及Entity Framework的結合。企業試圖集成現場和雲架構的趨勢讓BizTalk這個一度被認為已經死亡的技術看到了再度煥發生機的希望。