最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中使用Microsoft Unity記錄日志

 更新時(shí)間:2022年08月27日 10:50:19   作者:Darren Ji  
這篇文章介紹了C#中使用Microsoft Unity記錄日志的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

需要記錄日志的地方包括:進(jìn)入方法的時(shí)候,傳參的時(shí)候,統(tǒng)計(jì)執(zhí)行時(shí)間,方法返回參數(shù)的時(shí)候,退出語(yǔ)句塊的時(shí)候,出現(xiàn)異常的時(shí)候,等等。先來(lái)體驗(yàn)不使用Micirosoft Unity進(jìn)行日志記錄。

    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
            {
                //記錄進(jìn)入方法
                Console.WriteLine("馬上要執(zhí)行方法了");
                temp = string.Format("輸入的參數(shù)為:a={0},b={1}", a, b);
                Console.WriteLine(temp);
                //統(tǒng)計(jì)方法執(zhí)行時(shí)間
                Stopwatch watch = new Stopwatch();
                watch.Start();
                result = a + b;
                watch.Stop();
                Console.WriteLine("程序執(zhí)行時(shí)間為{0}", watch.Elapsed);
                //記錄返回值
                returnValue = string.Format("返回結(jié)果是:{0}", result);
                Console.WriteLine(returnValue);
                //記錄方法執(zhí)行接收
                Console.WriteLine("方法執(zhí)行結(jié)束");
            }
            catch (Exception ex)
            {
                //記錄異常
                Console.WriteLine(string.Format("異常信息是:{0},輸入?yún)?shù)是:{1}", ex.ToString(), temp));
                throw;
            }
            finally
            {
                //記錄異常處理
                Console.WriteLine("異常已經(jīng)被處理了");
            }
            return result;
        }
    }

以上,還是存在一些問(wèn)題:

  • 違反了"DRY"原則,如果還有其它方法,需要不斷地寫記錄的邏輯
  • 對(duì)閱讀代碼造成影響
  • 耗時(shí)

Microsoft Unity的出現(xiàn)就是解決以上問(wèn)題。

  • Proxy object or derived class是Unity攔截器,在執(zhí)行方法前后進(jìn)行攔截
  • Behaviors Pipeline是攔截行為管道,通過(guò)API注冊(cè)
  • Target Object or Original class method是進(jìn)行攔截的目標(biāo)對(duì)象

引用Unity和Unity.Interception組件

輸入關(guān)鍵字Unity,通過(guò)NuGet安裝Unity。
輸入關(guān)鍵字Unity.Interception,通過(guò)NuGet安裝Unity Interception Extension。
安裝完后,相關(guān)組件包括:

自定義攔截器

自定義的攔截器必須實(shí)現(xiàn)IInterceptionBehavior接口。

    public class MyInterceptionBehavior : IInterceptionBehavior
    {
        //返回?cái)r截行為所需要的接口
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }
        /// <summary>
        /// 使用本方法實(shí)施攔截行為
        /// </summary>
        /// <param name="input">目標(biāo)方法的參數(shù)</param>
        /// <param name="getNext">在攔截管道中的攔截行為的委托</param>
        /// <returns>目標(biāo)方法的返回值</returns>
        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            Console.WriteLine("hello,方法馬上開始執(zhí)行~~");
            IMethodReturn msg = getNext()(input, getNext);
            Console.WriteLine("bye,方法執(zhí)行完了");
            return msg;
        }
        //是否啟用攔截
        public bool WillExecute
        {
            get { return true; }
        }
    }

定義一個(gè)計(jì)算的接口

    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);
    }

對(duì)接口實(shí)現(xiàn)

    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>

以上,

  • 通過(guò)<alias>節(jié)點(diǎn)為接口和類設(shè)置別名
  • type="MyLogging.ICalculator, MyLogging"中,逗號(hào)前面是類名,逗號(hào)后面是程序集名稱

客戶端調(diào)用

    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);
            //執(zhí)行方法
            int res = calc.Add(1, 2);
            
            Console.ReadKey();
        }
    }

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • C#實(shí)現(xiàn)訪問(wèn)Web API Url提交數(shù)據(jù)并獲取處理結(jié)果

    C#實(shí)現(xiàn)訪問(wèn)Web API Url提交數(shù)據(jù)并獲取處理結(jié)果

    Web API  是 Web 服務(wù)器和 Web 瀏覽器之間的應(yīng)用程序處理接口,我們常見的模式是訪問(wèn) Web API Url 地址,并獲取 Json 、XML或其它指定格式的處理結(jié)果, 本文我們介紹了使用C#實(shí)現(xiàn)訪問(wèn)Web API Url提交數(shù)據(jù)并獲取處理結(jié)果,需要的朋友可以參考下
    2024-05-05
  • C# File類中的文件讀寫方法詳解

    C# File類中的文件讀寫方法詳解

    C#提供了多種操作文件的方案,尤其是File類中封裝的靜態(tài)方法,本文將通過(guò)一些簡(jiǎn)單的示例為大家講講C#讀寫文件的方法,需要的可以參考一下
    2023-05-05
  • C#開發(fā)微信門戶及應(yīng)用(3) 文本消息和圖文消息應(yīng)答

    C#開發(fā)微信門戶及應(yīng)用(3) 文本消息和圖文消息應(yīng)答

    這篇文章主要為大家詳細(xì)介紹了C#開發(fā)微信門戶及應(yīng)用第二篇,微信文本消息和圖文消息的應(yīng)答,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解讀赫夫曼樹編碼的問(wèn)題

    解讀赫夫曼樹編碼的問(wèn)題

    本篇文章對(duì)赫夫曼樹編碼的問(wèn)題進(jìn)行了分析說(shuō)明,需要的朋友參考下
    2013-05-05
  • C# 使用Proxy代理請(qǐng)求資源的方法步驟

    C# 使用Proxy代理請(qǐng)求資源的方法步驟

    這篇文章主要介紹了C# 使用Proxy代理請(qǐng)求資源的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • c# 如何將RadioButton與DataTable數(shù)據(jù)進(jìn)行綁定

    c# 如何將RadioButton與DataTable數(shù)據(jù)進(jìn)行綁定

    我接觸到的有將兩個(gè)控件的數(shù)據(jù)綁定、將控件的屬性與DataTable綁定,以下說(shuō)說(shuō)在將DataTable與RadioButton綁定的過(guò)程中出現(xiàn)的問(wèn)題
    2012-11-11
  • C#多線程基本使用小結(jié)

    C#多線程基本使用小結(jié)

    C#多線程編程涉及Thread、Task、異步和Parallel等工具,Thread類用于創(chuàng)建獨(dú)立線程,通過(guò)Priority屬性設(shè)置優(yōu)先級(jí),而線程池管理線程的調(diào)度和重用,本文給大家介紹C#多線程基本使用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • C# 模擬瀏覽器并自動(dòng)操作的實(shí)例代碼

    C# 模擬瀏覽器并自動(dòng)操作的實(shí)例代碼

    這篇文章主要介紹了C# 模擬瀏覽器并自動(dòng)操作的實(shí)例代碼,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#中List轉(zhuǎn)IList的實(shí)現(xiàn)

    C#中List轉(zhuǎn)IList的實(shí)現(xiàn)

    本文主要介紹了C#中List轉(zhuǎn)IList的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • c# winform異步不卡界面的實(shí)現(xiàn)方法

    c# winform異步不卡界面的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于c# winform異步不卡界面的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論

出国| 渝北区| 河南省| 渑池县| 吉安市| 明溪县| 梨树县| 大石桥市| 安顺市| 班戈县| 通山县| 衡东县| 仁怀市| 湘潭市| 句容市| 木兰县| 延吉市| 浮山县| 霍林郭勒市| 承德县| 全州县| 平昌县| 西峡县| 云阳县| 泉州市| 枝江市| 合江县| 定结县| 剑河县| 甘泉县| 景宁| 新绛县| 清河县| 叙永县| 慈溪市| 满城县| 遵义市| 平山县| 卢氏县| 雷山县| 庆元县|