Below you will find pages that utilize the taxonomy term “PostSharp”
Posts
PostSharp - Contract Inheritance
PostSharp 的 Contract 跟 Conde Contract 一樣,具備可被繼承的特性。凡是套用在 abstract、virtual、或 interface 方法上的 Contract,其子類別都會繼承到,在開發上十分的好用。
這邊來看個例子,筆者撰寫了個 IWritable 的介面,在其 Write 方法上我們加上了 RequiredAttribute,再建立個 Blog 類別去實作該介面。
Using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using PostSharp.Patterns.Contracts; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IWriteable blog = new Blog("LevelUp", "http://larrynung.github.io"); blog.Write("PostSharp Contract Inheritance", "Hello~Contract"); blog.Write("", ""); } } public interface IWritable { void Write([Required]string title, string content); } public class Blog : IWritable { public string Name { get; set; } public string Url { get; set; } public Blog(string name, string url) { this.
read morePosts
PostSharp - Custom Contract
PostSharp 內建的 Contracts 能支援我們做些常見的檢查,若是內建的無法滿足,我們也可以自行擴建 Contract。
擴建時要先確保 PostSharp.Patterns.Model 的引用已加入專案中,若無可透過 NuGet 將套件安裝起來。
{% img /images/posts/CustomPostSharpContract/1.png %}
接著建立個繼承自 LocationContractAttribute 的 Contract 類別,LocationContractAttribute 會提供我們建立 Contract Attribute 所需的基本功能,像是 CreateArgumentException、CreateArgumentNullException、CreateArgumentOutOfRangeException、及 ErrorMessage 等。
{% img /images/posts/CustomPostSharpContract/2.png %}
並實作 ILocationValidationAspect<T> ,在 ValudateValue 方法中撰寫自己的判斷邏輯,當不符合規範時叫用繼承自 LocationContractAttribute 的方法拋出例外即可。
筆者這邊以建立個 RegexMatch 的 Contract 為例,讓使用上可以帶上不同的正規表示式進行驗證。建立個繼承自 LocationContractAttribute 的類別 ,因為這邊要檢查的參數型態為字串,故還要實作 ILocationValidationAspect<string> 介面,在 ValudateValue 方法中會去判斷值是否符合我們設定的 Pattern,若否則叫用 CreateArgumentException 丟出例外。
public class RegexMatchAttribute : LocationContractAttribute , ILocationValidationAspect <string> { public String Pattern { get; set; } public RegexMatchAttribute(string pattern) : base() { this.
read morePosts
PostSharp - Contracts
以往我們在寫函式的時候,若要作參數的檢查,我們可能會自行去檢查參數是否 Null 或是 Empty,若是 Null 或 Empty 則丟出 ArgumentNullException。這樣的參數動作會混在程式邏輯的前面,PostSharp 的 Contract 功能就有點像是 Code Contract 一樣,能讓我們做前置條件的檢查,並將檢查抽離程式核心。
使用上只要在要加入檢查的參數上面按下滑鼠右鍵,然後在彈出的滑鼠右鍵快顯選單中,選取 Require a non-null and non whitespace value 這個選單選項。
{% img /images/posts/PostSharpContracts/1.png %}
接著 PostSharp 擴充套件會帶出精靈視窗,第一頁是 Summary 頁面,這邊只是告訴我們繼續下去會做什麼事,不外乎就是加入套件引用與加上對應的 RequiredAttribute,這邊直接 Next。
{% img /images/posts/PostSharpContracts/2.png %}
如 Summary 頁面所提,要處理的東西有點多,進度要稍微跑一下。
{% img /images/posts/PostSharpContracts/3.png %}
進度跑完後按下 Finish 按鈕結束精靈視窗即可。
可以看到專案已套上對應的修改,已將該引用的套件引用、RequiredAttribute 也已正確的加上。
{% img /images/posts/PostSharpContracts/4.png %}
滑鼠移上去再次確認,沒意外的話就會看到確實已經套用完成(若沒有這畫面可能是因為資料還未更新完成,可嘗試重建專案看看)。
{% img /images/posts/PostSharpContracts/5.png %}
{% img /images/posts/PostSharpContracts/6.png %}
運行後可看到帶入空值時確實會做參數的檢查,得到了預期的 ArgunemtNullException。
{% img /images/posts/PostSharpContracts/7.png %}
read morePosts
PostSharp - Changing the Logging Back-End
前面介紹 PostSharp 時,筆者多半都是透過精靈介面將之套用至專案之中,在加 Log 時有一步驟是設定 Log 機制背後要用的服務,這個在精靈介面設定完後,若有修改的必要,我們可以參閱下表:
{% img /images/posts/PostSharpChangLoggingBackEnd/1.png %}
將本來使用到的 Log Profile 其對應的 NuGet Package 移除,然後將欲使用 Log Profile 對應的 NuGet Package 加入專案中,接著開啟副檔名為 psproj 的設定檔,將其 LoggingBackend 的值設為對應的 Log Profile Name。
{% img /images/posts/PostSharpChangLoggingBackEnd/2.png %}
Link Walkthrough: Changing the Logging Back-End
read morePosts
PostSharp - Tracing Parameter Values Upon Exception
要使用 PostSharp 為程式加入 Exception 的 Log 處理,在安裝完 PostSharp 擴充套件後,我們可以在類別上直接按下右鍵,在彈出的滑鼠右鍵快顯選單中,選取 Add logging... 選單選項。
{% img /images/posts/PostSharpTracingUponException/1.png %}
接著 PostSharp 擴充套件會帶出精靈視窗,這邊要我們選取 Log 的 Profile,因為要這篇要示範 Exception 的處理,所以遠取 Exceptions 的 Profile 後按下 Next 按鈕即可。
{% img /images/posts/PostSharpTracingUponException/2.png %}
再來是要決定 Log 機制背後要用哪種服務,有 Trace、Console、Log4Net、NLog、Enterprise Library,一樣選取完後按下 Next 按鈕繼續。
{% img /images/posts/PostSharpTracingUponException/3.png %}
Summary 頁面這邊只是告訴我們繼續下去會做什麼事,不外乎就是加入套件引用、加上 LogException Attribute、 設定 Config,一樣按下 Next 繼續。
{% img /images/posts/PostSharpTracingUponException/4.png %}
如 Summary 頁面所提,要處理的東西有點多,進度要稍微跑一下。
{% img /images/posts/PostSharpTracingUponException/5.png %}
跑完後按下 Finish 按鈕結束精靈頁面。
{% img /images/posts/PostSharpTracingUponException/6.png %}
read morePosts
PostSharp - Customizing Logging
如果預設的 Log 設定不敷使用,像是 Log 的層級應該是 Error 而不是 Warning,或是 Log 應該含更多的資訊,這邊PostSharp 也支援我們有限幅度的客製。我們可以在類別上直接按下右鍵,在彈出的滑鼠右鍵快顯選單中,選取 Add logging… 選單選項。
{% img /images/posts/PostSharpCustomLogging/1.png %}
在 Log 設定這邊注意到下方有個 New logging profile... 連結按鈕,按下該連結按鈕即可建立一個新的設定。
{% img /images/posts/PostSharpCustomLogging/2.png %}
按下後會彈出 Log 設定的設定對話框,依需求決定這個設定的名稱、何時進行 Log 的紀錄、Log 紀錄時所要包含的資訊、以及 Log 的層級。
{% img /images/posts/PostSharpCustomLogging/3.png %}
選取剛所建立的設定,按下 Next 按鈕繼續。
{% img /images/posts/PostSharpCustomLogging/4.png %}
再來是要決定 Log 機制背後要用哪種服務,有 Trace、Console、Log4Net、NLog、Enterprise Library,一樣選取完後按下 Next 按鈕繼續。
{% img /images/posts/PostSharpCustomLogging/5.png %}
Summary 頁面這邊只是告訴我們繼續下去會做什麼事,不外乎就是加入套件引用、加上 Attribute、 設定 Config,一樣按下 Next 繼續。
{% img /images/posts/PostSharpCustomLogging/6.png %}
read morePosts
PostSharp - Adding Detailed Tracing to a Code Base
要使用 PostSharp 為程式加入些簡易的 Log 資訊,在安裝完 PostSharp 擴充套件後,我們可以在類別上直接按下右鍵,在彈出的滑鼠右鍵快顯選單中,選取 Add logging... 選單選項。
{% img /images/posts/PostSharpDetailedTraching/1.png %}
接著 PostSharp 擴充套件會帶出精靈視窗,這邊要我們選取 Log 的 Profile,這邊選取 Default Profile 後按下 Next 按鈕即可。
{% img /images/posts/PostSharpDetailedTraching/2.png %}
再來是要決定 Log 機制背後要用哪種服務,有 Trace、Console、Log4Net、NLog、Enterprise Library,一樣選取完後按下 Next 按鈕繼續。
{% img /images/posts/PostSharpDetailedTraching/3.png %}
Summary 頁面這邊只是告訴我們繼續下去會做什麼事,不外乎就是加入套件引用、加上 Attribute、 設定 Config,一樣按下 Next 繼續。
{% img /images/posts/PostSharpDetailedTraching/4.png %}
如 Summary 頁面所提,要處理的東西有點多,進度要稍微跑一下。
{% img /images/posts/PostSharpDetailedTraching/5.png %}
跑完後按下 Finish 按鈕結束精靈頁面。
可以看到專案已套上對應的修改,已引用該引用的套件、產生副檔名為 psproj 的設定檔、Attribute 也正確的加上。
{% img /images/posts/PostSharpDetailedTraching/6.png %}
滑鼠移上去再次確認,沒意外的話就會看到確實已經套用完成(若沒有這畫面可能是因為資料還未更新完成,可嘗試重建專案看看)。
read morePosts
PostSharp - Automatically Implementing INotifyPropertyChanged
要用 PostSharp 自動實作 INotifyPropertyChanged,在安裝完 PostSharp 擴充套件後,我們可以在類別上直接按下右鍵,在彈出的滑鼠右鍵快顯選單中,選取 Implement INotifyPropertyChanged 選單選項。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/1.png %}
接著 PostSharp 擴充套件會帶出精靈視窗,第一頁是 Summary 頁面,這邊只是告訴我們繼續下去會做什麼事,不外乎就是加入套件引用與加上對應的 Attribute,這邊直接 Next。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/2.png %}
如 Summary 頁面所提,要處理的東西有點多,進度要稍微跑一下。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/3.png %}
進度跑完後按下 Finish 按鈕結束精靈視窗即可。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/4.png %}
回過頭來看一下我們的專案,可以發現缺少的 PostSharp 參考被加入專案,且我們的類別上面被加上了 NotifyPropertyChanged 的 Attribute (可參閱 NotifyPropertyChangedAttribute Class,套上這 Attribute 會讓該類別及其子類都實作 INotifyPropertyChanged)。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/5.png %}
到這邊已經用 PostSharp 幫我們自動實作完 INotifyPropertyChanged 了,若有需要可將滑鼠移至類別上再次進行確認,沒意外的話就會看到確實已經套用完成(若沒有這畫面可能是因為資料還未更新完成,可嘗試重建專案看看)。
{% img /images/posts/PostSharpINotifyPropertyChangedImplement/6.png %}
若再次用反射進行解析。
using System; using System. Collections.Generic ; using System.
read more