如何使用Microsoft技術棧

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統


Microsoft技術棧最近有大量的變遷,這使得開發人員和領導者都想知道他們到底應該關注哪些技術。Microsoft自己并不想從官方層面上反對Silverlight這樣的技術,相對而言他們更喜歡讓這種技術慢慢淡出人們的視線,否則局面可能會更加混亂。如果你想了解該問題的答案,那么可以查看“.NET業務應用程序技術指南”這個小有名氣的文檔。該文檔發布于去年早些時候,它深入探討了Microsoft打算在哪些領域付出努力,我們應該回避哪些技術等內容。

下面這個概要圖是我們探索Microsoft及其相關技術的一個很好的起點。

(單擊放大圖片)


盡量早日放棄Silverlight和Flash


雖然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


Windows Phone推薦的技術是.NET和C++。再次重申,需要注意一下C++的性能優勢,但是他們說的最多的還是開發者應該使用自己更加熟悉的技術。

盡管Windows Phone兼容PhoneGap/Apache Cordova,但是這并沒有被提及。推測起來原因可能是他們認為在小設備上PhoneGap的性能比起.NET或者C++要差。在2013年度的Build大會上性能無疑是最重要的話題,超出了諸如一般可用性、可視化設計和深度OS集成等其他話題。

移動Web:都可以使用,除了Web表單


如果你想選擇一種能夠在所有移動設備上運行的、基于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種可行的技術選項。


首選:ASP.NET Web API


根據Microsoft所提供的信息,新項目的默認選擇應該是ASP.NET Web API。如果要開發遵循REST風格的服務,或者需要兼容“Akamai、Windows Azure CDN、Level3等”Internet緩存,那么可以使用該技術。

開發者在使用Web API的時候應該關注OData和JSON,前者標準化了REST端點的暴露方式。



第二選擇:WCF


與Web API相比WCF被認為是一種更加靈活的選項,因為它并沒有與任何特定的傳輸協議或者消息格式綁定。例如,你能夠利用TCP或者命名管道和二進制消息提升性能。缺點是WCF使用起來比較困難,特別是當你想要以JSON或者其他非基于SOAP的格式暴露數據時更是如此。

WCF是面向企業設計的,理念是RPC風格的通信。雖然它也可以使用面向大眾的REST風格的設計模式,但是這并不是該場景下的首選項。


WCF和OData


如果你的主要工作是CRUD風格的服務層,同時想要使用WCF技術棧,那么WCF數據服務是一個不錯的選擇。它與ASP.NET Web API共享OData類庫,并且通常會與Entity Framework結合使用。



Workflow服務


Workflow服務是Windows Workflow與WCF的結合。使用它的原因只有一個,那就是你的服務內部已經使用了Windows Workflow。Microsoft認為沒有讓你選擇這個選項的其他原因。


使用SignalR進行雙向通信


如果你僅想使用基于.NET的客戶端,那么WCF為良好的雙向通信提供了很多選項。但是如果你想要的是能夠同時支持.NET和基于Web的客戶端,那么SignalR是一個非常不錯的選擇。

根據Microsoft提供的信息,SignalR甚至能夠擴展到上百萬用戶。Web客戶端喜歡使用WebSockets,但是可以在必要的時候自動地回退到舊的模式,例如長輪詢。

SignalR還有一個針對.NET客戶端的類庫,允許Web和本地客戶端共享服務。


LightSwitch,另一個OData提供者


Microsoft對OData的喜愛程度夸張到我們幾乎難以用語言來描述。到現在為止,我們已經看到了用于WCF和Web API的OData,但是這并沒有結束。盡管通常情況下我們使用的是LightSwitch的客戶端,但是很顯然我們還可以使用它的服務器端能力快速地生成一個服務層。

Microsoft宣稱LightSwitch不需要任何編碼,但是同時也警告說這樣會喪失靈活性。


中小型企業應用程序指南


Microsoft為中小型企業編寫指南時一直遵循如下目標:

  • 提高完成速度,縮短上市時間

  • 提高生產效率并降低成本

  • 容易開始

  • 與市場產品的協作和集成

  • 云計算的靈活性以及降低成本的機會

通俗點說,它的意思就是“讓事情變得更快,成本更低”。Microsoft提供的這個具體的指南取決于你喜歡什么樣的展示模式。


中小型企業Web應用程序


對于快速而隨意的CRUD風格的應用程序而言,Microsoft推薦的首選平臺依然是LightSwitch。LightSwitch最初被描述為一個針對非專業程序員的工具。許多人將它看作是一個訪問的多層替代。但是隨著現在Microsoft更多的將其作為一個服務于需要快速推出應用程序的IT部門的工具,這個愿景似乎也已經消失。

接下來要講的是Web表單。是的,令人尊敬的Web表單依然是新項目推薦使用的技術。Microsoft將其看作是一種折中技術,介于易用但是有限制的LightSwitch和復雜的ASP.NET MVC之間。Web表單包含豐富的數據表格等功能,它依然能夠非常好的適用于企業內部的應用程序。

此外還提到了ASP.NET Web頁面,但僅僅是簡單介紹了一下。如果你認為Web表單所提供的渲染能力依然無法滿足自己的需求,那么可以選擇ASP.NET MVC。但是Microsoft針對其較長時間的學習曲線提出了警告。


構建Windows桌面程序


雖然所有基于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入手會讓你更有可能在不同的平臺之間共享代碼。

與常見的WinForms應用程序相比,WPF靈活的渲染引擎渲染的外觀更漂亮。當然這也是有代價的,在同等條件下WPF應用程序通常比WinForms應用程序運行的慢。

順便提一下LightSwitch桌面客戶端。好像它并不能提供任何可以在桌面客戶端中使用的東西,所以似乎沒有太多的理由選擇它。


應該避免使用客戶端—服務器模式


當Microsoft談到“客戶端—服務器”的時候,他們實際上指的是那些直接與數據庫通信的應用程序。盡管他們承認這依然是一個非常常見的模式,但是他們還是希望新項目使用3層設計,在客戶端和數據庫之間創建一個服務層。與直接訪問數據庫相比,這提供了更好的可伸縮性,同時還提供了一種可以繞開防火墻及其他障礙物的方式。另外它允許將應用程序移植到數據庫驅動不可用的平臺上。


"現代化" —放棄Windows桌面


對于如何“現代化”桌面應用程序Microsoft提供了很多建議。下面的建議大部分是有關于做好將應用程序遷移到其他平臺上的準備的,但是即使你并沒有打算放棄Windows桌面,這些指導對你而言依然是有一定用處的。相關建議的摘要如下:

  • 使用模型—視圖—視圖模型(MVVM)設計模式:Microsoft客戶端平臺(包括WPF)讓我們能夠容易地使用MVVM模式構建應用程序。借助于該模式,你能夠將展現與狀態和行為分離,能夠創建可以容易地在不同設備間分享、干凈可維護的代碼。

  • 客戶端邏輯使用可移植類庫:.NET可移植類庫允許我們在多個平臺之間共享二進制,例如桌面、Windows商店應用、Windows Phone應用以及其他平臺。使用.NET可移植類庫實現客戶端邏輯能夠極大地簡化多個平臺上多種體驗的創建工作。

  • 改進用戶體驗:最終用戶當前所需要的理念可以使用.NET針對桌面平臺最新的創新來實現。像“快速流暢”、“返璞歸真”和“事半功倍”這樣的設計原則能夠通過在XAML設計中使用現代UI、謹慎地使用動畫以及廣泛地實現.NET異步編程這些方法應用到已有的桌面應用程序中。

  • 將業務邏輯移動到服務器:雙層應用程序(客戶端/服務器)很難擴展到新設備上。推薦方式是將業務邏輯分離成非常清晰的服務,然后在其他設備上重用這些服務。

  • 擴展到云端:一旦將業務邏輯從客戶端中分離出來,那么就可以借助于Windows Azure所提供的多種解決方案將其移動到云端。將這些邏輯改造成云服務能夠極大地提升已有解決方案的彈性和可擴展性,讓它們做好擁抱多種設備的準備。


Android和iOS平臺上的.NET

Microsoft正在和一些合作伙伴一起努力,以幫助用戶實現現代化。下面是針對每一個合作伙伴所必須說的內容:

  • Xamarin 是一個跨平臺的開發工具,以Windows、Windows Phone、iOS和Android設備為目標的應用程序能夠借助于它分享C#代碼。我們能夠使用它訪問底層API,在設備間重用客戶端邏輯代碼的同時創建定制的視圖。

  • ITR-Mobility iFactr 和MonoCross 提供了一個解決方案,該方案允許我們使用C#構建可運行于主要移動平臺上的企業移動應用。它提供的抽象UI和企業數據同步等服務能夠讓業務程序跨多種設備。

  • Mobilize.NET來自于Art in Soft公司,它提供了可以幫助用戶將遺留應用程序遷移到現代化平臺(包括Web、移動和云)上的解決方案和服務。方法是將已有的源碼轉換成沒有運行時的新代碼。

  • Citrix Mobile SDK for Windows Applications為開發人員提供了豐富的工具箱,能夠幫助他們移動化LOB Windows應用或者編寫新的能夠在中央服務器(Citrix XenApp/XenDesktop)上執行且能夠使用Citrix Receiver從任意移動設備訪問的觸摸友好的應用。

邊注:Microsoft正在積極推動Xamarin和MonoCross的事實最終應該會平息一直流傳的Microsoft打算控告Mono制造商的謠言。


大型、關鍵業務應用程序指南


對于大型企業以及它們的關鍵業務應用程序而言,焦點不再是成本和生產率,而是復雜性管理和服務的質量。下面的指導方針并不適合數據驅動或者CRUD風格的應用程序,從事這種工作的開發者應該參照中小型企業指南。這些指導方針適用于有許多相互聯系的部分同時有大量獨立子系統的系統。


企業Web應用程序


Microsoft對于這一點的態度是明確的,他們認為關鍵的Web網站應該使用ASP.NET MVC。唯一的架構問題是是否應該在它上面使用單頁面應用程序設計模式。

不推薦使用其他Web技術,例如Web表單和Web頁面。因為它們不具備MVC的控制性和可測試性,這反過來限制了可獲得的服務的質量。


企業桌面應用程序


對于小型應用程序,Microsoft的推薦列表中依然包含WPF和WinForms。這種場景下他們還增加了C++和Win32/MFC。Microsoft推薦在可以與Microsoft Office相比的這種大型、長期項目中使用C++。這里的一個假定是AutoCAD和Paint.NET在規模方面是不同的。


企業Windows商店/Windows Phone


對于這一場景,Microsoft給出的建議類似于“新興應用程序模式”部分所給出的建議,除此之外并沒有其他內容。這樣的態度并沒有給用戶灌輸太多的信心,但是也沒有徹底地放棄平臺。


模式和實踐


在指南的最后,Microsoft并沒有繼續討論產品,而是花了大約20頁左右的篇幅討論模式和實踐。


控制反轉

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這個一度被認為已經死亡的技術看到了再度煥發生機的希望。

關于作者

Jonathan Allen從2006年開始就一直在為InfoQ撰寫新聞,他現在是.NET專欄的責任編輯。如果你想為InfoQ撰寫新聞或者教育性的文章,可以聯系他:jonathan@infoq.com。





dotNET跨平臺 2015-08-23 08:47:16

[新一篇] 《經濟學人》:再無6G ,5G將是移動技術進化的終點

[舊一篇] 讓游戲類APP病毒式傳播,你值得擁有!
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表