程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用Microsoft Unity進行日志記錄,unity日志記錄

使用Microsoft Unity進行日志記錄,unity日志記錄

編輯:C#入門知識

使用Microsoft Unity進行日志記錄,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


web player unity 日志在哪兒

win7是放在C:\Users\Administrator\AppData\Local\Temp\UnityWebPlayer\log
有目錄隱藏了的話給顯示出來就行了。
Administrator是登陸的用戶,根據自己的電腦選擇相應的文件夾。
xp的話根據這個目錄也能推測在哪了。
 

Unity3D設置使用VS2012做腳本編輯,但每次還是啟動Monodevelop怎辦

我也遇到這個問題了……後來把vs修復了一遍,修復之後啟動一遍vs,然後用unity就可以連接啦!

修復差不多相當於重新安裝了一遍……太費時間……


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved