需要記錄日志的地方包括:進入方法的時候,傳參的時候,統計執行時間,方法返回參數的時候,退出語句塊的時候,出現異常的時候,等等。先來體驗不使用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><sectionname="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" /><sectionExtensiontype="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){//加載UnityContainerIUnityContainer 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
win7是放在C:\Users\Administrator\AppData\Local\Temp\UnityWebPlayer\log
有目錄隱藏了的話給顯示出來就行了。
Administrator是登陸的用戶,根據自己的電腦選擇相應的文件夾。
xp的話根據這個目錄也能推測在哪了。
我也遇到這個問題了……後來把vs修復了一遍,修復之後啟動一遍vs,然後用unity就可以連接啦!
修復差不多相當於重新安裝了一遍……太費時間……