ASP.NET MVC 開發心得分享 (13):在類別庫取得 RouteData

之前在 ASP.NET Web Form 的年代要在 類別庫(Class Library) 專案中取得 HttpContext 的資訊,很容易就可以透過 HttpContext.Current 屬性即可獲得所需資訊,也可以判斷 HttpContext.Current 是否為 null 來決定是否目前是在 Web 環境下,雖然到了 ASP.NET MVC 的世界也有 HttpContext.Current 但是我們更需要 RouteData 資訊讓我們能進一步取得 ASP.NET MVC 的相關資訊。

類別庫(Class Library) 中一樣可以用 HttpContext.Current 是否為 null 來判斷目前是否為 ASP.NET 的執行環境,而至於要取得 RouteData 資訊可以透過 System.Web.Routing.RouteTable.Routes 這個靜態屬性將 RouteData 型別的資料傳回,請參考以下程式碼:

var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));

以下是我在 類別庫(Class Library) 中下中斷點取得 Route Values 的示意圖:

在 類別庫(Class Library) 中下中斷點取得 Route Values 的示意圖

而在 類別庫(Class Library) 中要引用 ASP.NET MVC 的資訊至少必須載入以下圖示的兩個組件,如果沒有 System.Web 組件的話也要記得載入:

當你透過上述範例取得 route 物件時,就可以輕易存取 Route Values 了,如下範例:

var controllerName = route.Values["controller"]; 
var actionName = route.Values["action"];

相關連結

  

此文章由 will 發表於 2009/12/30 下午 10:31:03

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET MVC

標籤: , ,

收藏:

如何設立 AppFabric Caching (Velocity) 開發環境

研究 Beta 版的技術真是累人,很多事情講的不清不楚,害我花了好多時間才將 AppFabric Caching (Code Name: Velocity) 的開發環境弄好,以下是將 Velocity 開發環境設立完成的完整過程。

設立環境主要分兩個步驟:

  1. 安裝 AppFabric Caching 必要元件
  2. 取得開發用必要 .NET 組件

 

安裝 AppFabric Caching 必要元件

我們可以透過 Web Platform Installer 直接安裝 AppFabric Caching 服務,事實上在未來正式 AppFabric Caching 會整合成一個「伺服器角色」稱為 Application Server ( 大概會叫這個名字 ),安裝過程圖示如下:

如果不想自動安裝,也可以到 Download details: Windows Server AppFabric Beta 1 下載獨立安裝檔與相關文件 ( Installation GuideRelease Notes )。

安裝完成後,所有程式與 .NET 組件都會擺在以下目錄:

C:\Windows\System32\ApplicationServerExtensions

 

取得開發用必要 .NET 組件

在安裝目錄下有兩個組件是開發時必須的,這就是開發時所需的組件 ( Client Library )

安裝完成後其實所有必要組件都會直接註冊進 GAC 中,且命名空間為 Microsoft.Data.Caching,但是透過 Visual Studio 卻無法「加入參考」( Add Reference ),因為在加入參考的對話框中怎樣也找不到 Microsoft.Data.Caching 這個命名空間,若你透過「瀏覽」( Browse ) 的方式直接進入安裝目錄也會發生找不到檔案的錯誤,讓你無法將這兩個組件加入參考,如下圖示:

Add Reference

最後,我研究出兩種方法可以成功加入組件參考:

1. 直接修改專案檔 ( 透過 Windows Server AppFabric Beta 1 Samples 範例程式查到的 )

2. 將組件複製到專案目錄下,然後再透過「瀏覽」的方式加入參考

 

相關連結

  

此文章由 will 發表於 2009/12/29 下午 08:33:46

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | 心得分享 | Windows Azure

標籤: , , ,

收藏:

如何在 CodeRush 設定 Jump to Implementations 的快速鍵

CodeRush for Visual Studio .NET 是我最愛的 Visual Studio 外掛之一 (商業軟體),他幫我大幅縮短許多開發時間,而且功能強大到一個無可附加的地步。CodeRush v3 實現了 Jump to Implementations 功能讓我驚喜萬分,為了能直接運用這個功能,我研究了好些時間才將快速鍵設定好。

我們每個 ASP.NET MVC 的專案都會使用 Repository Pattern,都會先設計 Interface 然後再明確實做 Class。在 Visual Studio 中內建的 GoToDefintiaion (移至定義) 功能有個 F12 快速鍵只能將游標移至 Interface 而已,對我們來說最好能將游標移至那個明確實做的 Class 裡才能查看實際撰寫的程式碼,而當初在 CodeRush v2 時並無此功能,我從今年四月份建議他們開發這個功能,最後終於在苦等 8 個月後在 CodeRush v3 實現了。

以下是設定 Jump to Implementations 快速鍵的操作過程筆記。

 

開啟 DevExpress 的 Options 選單

開啟 DevExpress 的 Options 選單

從左側選單找到 IDE 目錄下的 Shortcuts 項目,並點擊「搜尋」圖示,再切換至 Command 頁籤,並在 Command 輸入(或選取) Navigate 後按下 [Find] 按鈕

從左側選單找到 IDE 目錄下的 Shortcuts 項目,並點擊「搜尋」圖示,再切換至 Command 頁籤,並在 Command 輸入(或選取) Navigate 後按下 [Find] 按鈕

找到後你會發現預設 Navigate 功能的快速鍵是 Ctrl+Alt+N,而 Context 為 Code Editor (程式碼編輯器)

找到後你會發現預設 Navigate 功能的快速鍵是 Ctrl+Alt+N,而 Context 為 Code Editor (程式碼編輯器)

如果你在 Code Editor (程式碼編輯器) 中,鍵盤游標為於 Method 之中,這時按下 Ctrl+Alt+N 就會出現 “Jump To…” 的畫面,這時我們常用的 Implementations 功能就會出現。

如果你在 Code Editor (程式碼編輯器) 中,鍵盤游標為於 Method 之中,這時按下 Ctrl+Alt+N 就會出現 “Jump To…” 的畫面,這時我們常用的 Implementations 功能就會出現。

這時我們再回到 Shortcuts 編輯視窗,這時可以修改快速鍵與 Navigate 功能鍵的傳入參數 (如下圖示)

  1. 相較於 Visual Studio 內建的 F12 快速鍵 (Edit.GoToDefinition) 功能,對於 Jump to Implementations 此功能的快速鍵我認為設定成 Ctrl+F12 比較好記。
  2. 由於我們只要指派 Ctrl+F12 快速鍵到 Jump to Implementations 功能,所以必須在 Parameters 參數欄位輸入 Implementations 才能完成設定。

 自定 Shortcuts

如果你不想改掉原本預設的 Ctrl+Alt+N 快速鍵,也可以自行新增一組新的 Ctrl+F12 快速鍵 (如下圖示),但記得設定時要選取 Code Editor 就好,讓該快速鍵僅在 Code Editor 使用:

如果你不想改掉原本預設的 Ctrl+Alt+N 快速鍵,也可以自行新增一組新的 Ctrl+F12 快速鍵 (如下圖示),但記得設定時要選取 Code Editor 就好,讓該快速鍵僅在 Code Editor 使用

相關連結

  

此文章由 will 發表於 2009/12/28 下午 09:15:33

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 介紹好用工具 | Tips

標籤: , ,

收藏:

Windows Server AppFabric Caching (Velocity) 心得筆記

最近在研究一項我追蹤已久的記憶體快取技術 Velocity ( 現在已經被納入 Windows Server AppFabric 產品中 ),這是一個分散式記憶體快取的平台,非常適合用來開發 3H ( High Scalability, High Availability, High Performance ) 應用系統開發,他可以將多台伺服器的記憶體融合(fuse)成一個超大記憶體快取,讓你的應用程式能夠非常方便的運用這些記憶體完成應用程式加速的目的,也可減低資料庫的負擔。

這套 Velocity 比我之前用過的 memcached 複雜多了,所以在看 Introduction to Caching with Windows Server AppFabric (Beta 1) 時有點吃力,都要反覆的咬文嚼字、慢慢的看、慢慢的理解才能確認我想的跟文件所描述的是一致的想法,避免錯誤理解導致日後開發上的錯誤。

 

Windows Server AppFabric Caching 的能力

Windows Server AppFabric Caching Capabilities

從上圖可看出 Velocity 在運作時的大致架構,他提供 Clients 一個統一的快取介面(Unified Cache View),他讓 Client 可以不用在意到底實體的快取服務層(Cache Layer)有多複雜,透過統一的 API 介面就可以運用 Velocity 進行 3H 開發。

Windows Server AppFabric Caching 主要特色有:

  • 任何可以被序列化的 CLR 物件都可以透過簡單的 Cache API 將資料快取
  • 支援企業規模:可支援上百台主機的伺服器架構
  • 可彈性的調整設定,並透過網路存取服務
  • 支援動態調整規模,可隨時新增節點
  • 支援高可用性架構
  • 自動負載平衡
  • 可與 Event Tracing for Windows (ETW), System Center 等機制整合管理與監控
  • 提供與 ASP.NET 的無縫整合,將 Session 資料儲存至快取,也可在 Web farm 架構下將應用程式資料快取,減少資料庫大量存取的負擔
  • 第一版遵循 cache-aside architecture ( 明確快取, Explicit Caching ),意即你必須在你的應用程式中明確指明你要新增(Put)或移除(Remove)快取的項目,所有快取資料並不會自動與任何來源資料庫進行同步。

 

【 分散式記憶體快取基本觀念 】

三種快取資料類型 ( Types of Data )

瞭解不同的快取資料類型可以幫助你決定在何種情境下使用何種快取資料類型,因為不同的快取資料類型適用的快取情境是不同的。

1. 參考資料類型 ( Reference Data )

這種資料類型負責儲存「較重要的資料」而且這類資料都是不會經常變動的資料,而且每次變更資料都會建立一個新的版本,所以這類資料非常適合用來分享給多使用者、多應用程式的情況,用以加速所有應用程式的存取速度,減低各應用程式對資料庫系統造成的負荷。

對於「讀取」需求遠大於「寫入」需求的資料都很適合用這種資料類型進行資料快取,例如:產品型錄。

針對大型應用程式或大流量的網站,參考資料類型也可以設定成自動複寫到快取叢集的多台伺服器,以增加應用系統的延展性。

2. 活動資料類型 ( Activity Data )

所謂活動資料類型指的是短暫的程式資料,這類資料通常不會被各應用程式或不同使用者分享,例如購物車資訊,就屬於這類活動資料。這類資料在大型應用中甚至可以跨伺服器的分割快取空間,可以很輕易的達到高延展性的需求。

3. 資源資料類型 ( Resource Data )

不管是 Reference Data (共享讀取) 或 Activity Data (獨佔寫入) 已經很適合做資料快取,但並非所有應用程式類型都支援這種方式快取,這裡的「資源資料」指的是「共享的」且「同時需要被讀寫」的資料,而且存取量都非常大的情況。 例如「庫存資訊」的庫存量就經常變動,而且必須提供各應用程式即時的資訊,而且可能隨時變更庫存數量,這類資料就稱之為資源資料

這類型的快取資料通常遇到最大的問題在於很難提供高有效性(High Availability)的支援,由於維護高有效性的資料必須精準的維持資料的一致性,所以必須實做交易處理(transactions)、變更通知(data change notifications)、設定快取失效(invalidations)等特性,透過 Velocity 可讓你設定這類資料自動複寫到不同快取主機,輕易達到 高有效性 的需求。

 

使用情境

1. 社交網絡網站 ( Social Networking Site )

社交網絡網站 ( Social Networking Site ) 使用情境

由於使用者名稱、好友清單都是不會經常變動的資料,所以這種情境很適合採用 參考資料類型 (Reference Data) 來進行快取。

2. 企業商用軟體 ( Enterprise LOB ) -- 例如: ERP, CRM, …

企業商用軟體 ( Enterprise LOB ) 使用情境

如上圖例,對於供應商資料、價格資訊可以透過 參考資料類型 (Reference Data) 來進行快取,而其他像是訂單資訊、發票資訊、付款資訊 都可以用 活動資料類型 (Activity Data) 來快取。

大型網路通常會實做 NLB (網路負載平衡),所以不會使用者不見得每次都會連接到同壹台 IIS 主機,所以透過這類分散式快取技術就很適合這種快取情境,避免把資料庫操到掛。

 

AppFabric Caching 基本觀念 】

上面講的是關於「分散式快取架構」的基本觀念,這裡講的是「開發模型」的基本觀念,瞭解這些觀念才能讓你在實際利用 AppFabric Caching (Code Name: Velocity) 開發程式時才能有比較清晰的概念,避免看程式看到傻眼。

邏輯階層架構 ( Logical Hierarchy )

邏輯階層架構 ( Logical Hierarchy )

邏輯架構依序描述如下:

  • 每台 伺服器 (Machine) 可以執行好幾個 快取實體(Cache Instance 或 Cache Host)
    註: 就好像壹台機器可以執行好幾個 SQL Server Instance 一樣意思。
  • 每個 快取實體 (Cache Host) 可以包含多個 具名快取空間 (Named Cache)
    註: 具名快取可以設定跨越多個 Cache Hosts 或 Machines
  • 每個 具名快取空間 (Named Cache) 可以包含多個 區域 (Regions)
  • 每個 快取區域 (Regions) 可以包含多個 快取項目 (Cache Items)
  • 每個 快取項目 (Cache Items) 包含 可序列化物件 (Objects)

一個簡單的範例如下:

// CacheFactory class provides methods to return cache objects
// Create instance of CacheFactory (reads appconfig)
DataCacheFactory fac = new DataCacheFactory();
// Get a named cache from the factory
DataCache catalog = fac.GetCache("catalogcache");
//-------------------------------------------------------
// Simple Get/Put
catalog.Put("toy-101", new Toy("thomas", "FunToy"));
// From the same or a different client
Toy toyObj = (Toy)catalog.Get("toy-101");
// ------------------------------------------------------
// Region based Get/Put
catalog.CreateRegion("toyRegion", true);
// Both toy and toyparts are put in the same region
catalog.Put("toy-101", new Toy("FunToy"), "toyRegion");
catalog.Put("toypart-100", new ToyParts("Wheel"), "toyRegion");
Toy toyObj = (Toy)catalog.Get("toy-101", "toyRegion");

快取觀念 ( Cache Concepts )

  • 主要節點 ( Primary Node )
    • 所有 區域 (Regions) 的資料都會置於主要節點上,任何透過 Cache Client 過來取得快取資料時都會自動被導向(Routed)到主要節點存取快取資料。
  • 次要節點 ( Secondary Nodes )
    • 如果 具名快取空間 (Named Cache) 為了高可用性(high availability) 而設定「備份」,就會用「次要節點」用來儲存這些「備份用的 區域 (Regions) 」(備註: 區域包含多個快取項目)。如果「主要節點」損毀,快取叢集所收到的要求就會自動轉向到「次要節點」來取得快取資料。

快取型態 ( Cache Types )

AppFabric 支援兩種常見的快取型態:分割快取、本地快取

  • 分割快取 ( Partitioned Cache )
    • 講「分割快取」很容易誤解其意思,這概念並不像「磁碟分割」那樣一棵實體硬碟分割成好幾個磁區,而是將「所有快取伺服器」全部整合成一個記憶體快取儲存區 (快取叢集),你可以在這個「快取叢集」分割出你想要的任何大小。
    • 因此,透過 Partitioned Cache 很適合用在需要大量記憶體快取的應用程式,這可大幅提升應用程式的延展性(Scalability),當記憶體不夠用時就只要增加伺服器即可。
    • 新快取伺服器加入整個快取叢集後,Velocity 會自動進行負載平衡,並將部分快取項目自動移至新主機,當快取項目平均分散在各台主機後也會增加整體快取叢集的吞吐量(Throughtput)。
    • 由於是將多台伺服器整合成一個大記憶體,所以快取資料並不會重複儲存,如下圖例:K2,V2 指的是 “Key/Value Pair 2” 的意思,由於透過 Put 指令寫入快取項目時勢將資料寫入到 Cache 2 這個 快取實體(Cache Host) 中,所以當另一台主機從 Cache 3 取得(Get) K2,V2 資料時,就會透過 Velocity 內部的 Routing 機制從 Cache2 取得資料,而這些複雜的 Routing 作業全都由 Velocity 幫你完成。

    • Partitioned Cache 還能設定「次要快取節點」,讓「主要快取資料」能自動將快取項目複寫到另一台主機,達到高有效性(High Availability)的目標,如下是 HA 模式的示意圖:

 

  • 本地快取 ( Local Cache )
    • Velocity 也支援「本地快取」,透過本地快取可以有效省去「序列化/反序列化」的 CPU 成本,可提升讀寫快取資料時的效能。
    • 如下圖示很容易能看出運用本地快取的情境:

過期與回收 ( Expiration and Eviction )

  • 快取過期 ( Expiration )
    • 在新增快取項目到 Regions 時可以指定該物件的存活時間(TTL; Time To Live)
  • 快取回收 ( Eviction )
    • 快取項目可以設定優先等級,當快取記憶體不夠用時就會依據 LRU (least-recently-used) 演算法將不常用的快取項目刪除,讓優先權較高的快取項目進入快取伺服器。

一致性模型 ( Consistency Models )

  • 樂觀版本更新機制 ( optimistic version-based updates )
    • 透過這個機制可享受較高的執行效能,因為就算不同的 Client 端在同時執行 取得快取(Get) 或 寫入快取(Put) 動作可以同時執行,Velocity 會在內部維護一份快取項目的版本資訊,而且會在每次取得(Get)資料時一併傳回用戶端,所以不用維護鎖定(locking)的問題,但版本資訊在 Client 端需自行判斷新舊。
  • 悲觀鎖定機制 ( pessimistic locking )
    • 透過 API 提供的 GetandLock 取得資料時,若有其他程序也要透過 GetandLock 取得資料時就會發生失敗,但若 Client 使用單純的 Get 取得資料還是可以的。
    • 這時透過 PutAndLock 方法可以將資料回寫至 Velocity,這時鎖定狀態就會被解除,但如果直接使用 Put 方法則會直接取消鎖定狀態並直接複寫該物件的值,所以必須小心使用。
    • 透過 UnLock 方法也可以直接設定解除鎖定。

變更通知 ( Notifications )

在分散式的架構下,由於多個用戶端同時存取同一份資源,實做變更通知變的非常實用,當另一個用戶端變更了某個 區域 (Regions) 快取項目 (Cache Items) 時可以透過事件通知應用程式。

部署拓樸 ( Deployment Topology )

Velocity 是透過 Windows Service 提供服務,可以透過 TCP/IP 從本機或遠端電腦連線,並透過 .NET Client API 直接操作使用。

如下圖是兩種常見的 Velocity 部署模式:

  • Embedded
    • 快取實體(Cache Host) 跟 IIS 主機安裝在一起,並聯合多台主機組成快取叢集
  • Cache Service
    • 使用 專屬主機 提供 快取實體(Cache Host),提供一個實體的 快取層(Caching Tier)

部署拓樸 ( Deployment Topology )

ASP.NET 整合 ( ASP.NET Integration )

Velocity 預設提供一組 SessionStoreProvider 可讓你無痛的將 Session 移至 AppFabric Caching 平台,並儲存到一個 分割快取 (Partitioned Cache) 中,透過設定也可以達到 HA (High Availability) 與 HS (High Scalability) 的規劃。

效能測試 ( Performance Testing )

如下圖示,只要新增快取伺服器幾乎呈現「線性成長」的吞吐量,可有效提升應用程式的延展性。

效能測試 ( Performance Testing )

結論 ( Conclusion )

透過 AppFabric Caching 可以輕易的讓你將多台伺服器的記憶體融合成一個超大記憶體快取,透過單一 API 即可存取這些記憶體快取,當記憶體不夠時只要增加伺服器即可輕易擴充完成,不止有效降低管理成本,還可輕易的達成 3H ( High Scalability, High Availability, High Performance ) 系統架構。

相關連結

  

此文章由 will 發表於 2009/12/25 下午 06:39:41

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 心得分享 | Windows Azure

標籤: , , ,

收藏:

分享一個快速切換 Excel 工作表的快速鍵與其他常用快速鍵

當你在一個 Excel 中有許多工作表時,尤其是要不斷切換工作表比較內容時,用滑鼠點來點去實在不夠有效率,所以記住一些常用的快速鍵的確可以提升工作效率,今天我就來分享幾個我個人在 Excel 裡面常用的快速鍵。

快速切換工作表

  • Ctrl + PageDown    切換至下一個工作表
  • Ctrl + PageUp        切換至上一個工作表

插入或刪除儲存格、欄、列

  • Ctrl + +           顯示插入對話框,可讓你選擇要插入儲存格、插入整列或插入整欄
  • Ctrl + -            顯示刪除對話框,可讓你選擇要刪除儲存格、刪除整列或刪除整欄

隱藏列或欄

  • Ctrl + 9            隱藏目前游標所在的資料列 (橫的叫列)
  • Ctrl + 0            隱藏目前游標所在的資料行 (直的叫欄)

重複執行上一個動作

  • F4 或 Ctrl + Y 都可以達到相同的功能,我個人比較習慣用 Ctrl + Y
  • 例如你改了某欄位的文字顏色,移到其他儲存格之後點選 Ctrl + Y 快速鍵,就會重複執行上個動作

其他常用功能鍵

  • F2               修改儲存格內容 ( 這個快速鍵蠻常用的,可以少用不少滑鼠 )
  • Shift + F2    針對儲存格插入註解 ( 對於儲存格內容進行註釋時,可以很方便快速加入註解 )
  • F12             另存新檔 ( 透過此快速鍵可讓你將檔案另存成 PDF 或其他格式 )
  • Alt + F        開啟檔案功能表 ( 這在 Excel 2010 中蠻好用的,不說可能有人不知道 )
  • Ctrl + P       開啟列印視窗 ( 這在 Excel 2010 中同時也能用來當作「預覽列印」的功能 )

相關連結

  

此文章由 will 發表於 2009/12/22 下午 08:30:46

永久連結 | 評論 (7) | 此文章的RSSRSS comment feed |

分類: Office

標籤: ,

收藏: