使用Microsoft Unity进行日志记录
需要記錄日志的地方包括:進入方法的時候,傳參的時候,統計執行時間,方法返回參數的時候,退出語句塊的時候,出現異常的時候,等等。先來體驗不使用Micirosoft Unity進行日志記錄。
?
class Program { static void Main(string[] args) { Add(1, 2); Console.ReadKey(); } private static int Add(int a, int b) { int result = 0; string temp = string.Empty; string returnValue = string.Empty; try { //記錄進入方法 Console.WriteLine("馬上要執行方法了"); temp = string.Format("輸入的參數為:a={0},b={1}", a, b); Console.WriteLine(temp); //統計方法執行時間 Stopwatch watch = new Stopwatch(); watch.Start(); result = a + b; watch.Stop(); Console.WriteLine("程序執行時間為{0}", watch.Elapsed); //記錄返回值 returnValue = string.Format("返回結果是:{0}", result); Console.WriteLine(returnValue); //記錄方法執行接收 Console.WriteLine("方法執行結束"); } catch (Exception ex) { //記錄異常 Console.WriteLine(string.Format("異常信息是:{0},輸入參數是:{1}", ex.ToString(), temp)); throw; } finally { //記錄異常處理 Console.WriteLine("異常已經被處理了"); } return result; } }以上,還是存在一些問題:
○ 違反了"DRY"原則,如果還有其它方法,需要不斷地寫記錄的邏輯
○ 對閱讀代碼造成影響
○ 耗時
?
Microsoft Unity的出現就是解決以上問題。
○ Proxy object or derived class是Unity攔截器,在執行方法前后進行攔截
○ Behaviors Pipeline是攔截行為管道,通過API注冊
○ Target Object or Original class method是進行攔截的目標對象
□ 引用Unity和Unity.Interception組件
?
輸入關鍵字Unity,通過NuGet安裝Unity。
輸入關鍵字Unity.Interception,通過NuGet安裝Unity Interception Extension。
安裝完后,相關組件包括:
?
□ 自定義攔截器
自定義的攔截器必須實現IInterceptionBehavior接口。
?
public class MyInterceptionBehavior : IInterceptionBehavior { //返回攔截行為所需要的接口 public IEnumerable<Type> GetRequiredInterfaces() { return Type.EmptyTypes; } /// <summary> /// 使用本方法實施攔截行為 /// </summary> /// <param name="input">目標方法的參數</param> /// <param name="getNext">在攔截管道中的攔截行為的委托</param> /// <returns>目標方法的返回值</returns> public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { Console.WriteLine("hello,方法馬上開始執行~~"); IMethodReturn msg = getNext()(input, getNext); Console.WriteLine("bye,方法執行完了"); return msg; } //是否啟用攔截 public bool WillExecute { get { return true; } } }?
□ 定義一個計算的接口
?
public interface ICalculator { int Add(int value1, int value2); int Subtract(int value1, int value2); int Multiply(int value1, int value2); int Divide(int value1, int value2); }?
□ 對接口實現
?
public class Calculator : ICalculator { public int Add(int value1, int value2) { int res = value1 + value2; Console.WriteLine(res); return res; } public int Subtract(int value1, int value2) { int res = value1 - value2; return res; } public int Multiply(int value1, int value2) { int res = value1 * value2; return res; } public int Divide(int value1, int value2) { int res = value1 / value2; return res; } }?
□ 配置文件中配置Unity
?
<configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <alias alias="ICalculator" type="MyLogging.ICalculator, MyLogging"/> <alias alias="Calculator" type="MyLogging.Calculator, MyLogging"/> <alias alias="MyBehavior" type="MyLogging.MyInterceptionBehavior, MyLogging" /> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" /> <container> <extension type="Interception"/> <register type="ICalculator" mapTo="Calculator"> <interceptor type="InterfaceInterceptor" /> <interceptionBehavior type="MyBehavior"/> </register> </container> </unity> </configuration>以上,
○ 通過<alias>節點為接口和類設置別名
○ type="MyLogging.ICalculator, MyLogging"中,逗號前面是類名,逗號后面是程序集名稱
?
□ 客戶端調用
?
using System; using System.Collections.Generic; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; class Program { static void Main(string[] args) { //加載UnityContainer IUnityContainer container = new UnityContainer(); container = Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container); //解析出接口 ICalculator calc = Microsoft.Practices.Unity.UnityContainerExtensions.Resolve<ICalculator>(container); //執行方法 int res = calc.Add(1, 2); Console.ReadKey(); } }?
?
參考資料:
http://www.lm-tech.it/Blog/post/2011/10/18/How-to-use-the-Unity-Interception-Extension.aspx
轉載于:https://www.cnblogs.com/darrenji/p/3963789.html
總結
以上是生活随笔為你收集整理的使用Microsoft Unity进行日志记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用最简单的例子理解策略模式(Strate
- 下一篇: 蔡勒公式 计算星期