欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中使用Microsoft Unity記錄日志

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

需要記錄日志的地方包括:進入方法的時候,傳參的時候,統(tǒng)計執(zhí)行時間,方法返回參數(shù)的時候,退出語句塊的時候,出現(xiàn)異常的時候,等等。先來體驗不使用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("馬上要執(zhí)行方法了");
                temp = string.Format("輸入的參數(shù)為:a={0},b={1}", a, b);
                Console.WriteLine(temp);
                //統(tǒng)計方法執(zhí)行時間
                Stopwatch watch = new Stopwatch();
                watch.Start();
                result = a + b;
                watch.Stop();
                Console.WriteLine("程序執(zhí)行時間為{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;
        }
    }

以上,還是存在一些問題:

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

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

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

引用Unity和Unity.Interception組件

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

自定義攔截器

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

    public class MyInterceptionBehavior : IInterceptionBehavior
    {
        //返回攔截行為所需要的接口
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }
        /// <summary>
        /// 使用本方法實施攔截行為
        /// </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; }
        }
    }

定義一個計算的接口

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

對接口實現(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>

以上,

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

客戶端調(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();
        }
    }

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

相關(guān)文章

  • C#的并發(fā)機制優(yōu)秀在哪你知道么

    C#的并發(fā)機制優(yōu)秀在哪你知道么

    這篇文章主要為大家詳細(xì)介紹了C#的并發(fā)機制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • c#通過進程調(diào)用cmd判斷登錄用戶權(quán)限代碼分享

    c#通過進程調(diào)用cmd判斷登錄用戶權(quán)限代碼分享

    最近自己開發(fā)軟件需要讀取本地配置文件,因為登錄用戶的權(quán)限不夠會導(dǎo)致無法讀取文件進而導(dǎo)致程序崩潰,查了一些解決方法,代碼分享如下
    2013-12-12
  • C#事件管理器如何清空所有監(jiān)聽詳解

    C#事件管理器如何清空所有監(jiān)聽詳解

    這篇文章主要給大家介紹了關(guān)于C#事件管理器如何清空所有監(jiān)聽的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • .net實現(xiàn)裁剪網(wǎng)站上傳圖片的方法

    .net實現(xiàn)裁剪網(wǎng)站上傳圖片的方法

    這篇文章主要介紹了.net實現(xiàn)裁剪網(wǎng)站上傳圖片的方法,比較實用的功能,需要的朋友可以參考下
    2014-07-07
  • C# 獲取XML文件內(nèi)容的多種方式總結(jié)

    C# 獲取XML文件內(nèi)容的多種方式總結(jié)

    這篇文章主要介紹了C# 獲取XML文件內(nèi)容的多種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#基于Mongo的官方驅(qū)動手?jǐn)]一個Super簡易版MongoDB-ORM框架

    C#基于Mongo的官方驅(qū)動手?jǐn)]一個Super簡易版MongoDB-ORM框架

    本文給大家分享C#基于Mongo的官方驅(qū)動手?jǐn)]一個簡易版MongoDB-ORM框架,是一款屬于super簡易版的,通過圖文的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • C#線程同步的三類情景分析

    C#線程同步的三類情景分析

    這篇文章主要介紹了C#線程同步的三類情景分析,較為詳細(xì)生動的講述了C#線程同步的三類情況,讓大家對C#多線程程序設(shè)計有一個深入的了解,需要的朋友可以參考下
    2014-10-10
  • C# OCR實現(xiàn)文字識別功能

    C# OCR實現(xiàn)文字識別功能

    OCR,中文叫做光學(xué)字符識別。它是利用光學(xué)技術(shù)和計算機技術(shù)把印在或?qū)懺诩埳系奈淖肿x取出來,并轉(zhuǎn)換成一種計算機能夠接受、人又可以理解的格式。本文將利用OCR實現(xiàn)文字識別功能,感興趣的可以了解一下
    2022-11-11
  • C#調(diào)用SQLite的方法實例分析

    C#調(diào)用SQLite的方法實例分析

    這篇文章主要介紹了C#調(diào)用SQLite的方法,較為詳細(xì)的介紹了SQLite的功能與特點,并實例分析了C#調(diào)用SQLite的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C#使用foreach語句遍歷堆棧(Stack)的方法

    C#使用foreach語句遍歷堆棧(Stack)的方法

    這篇文章主要介紹了C#使用foreach語句遍歷堆棧(Stack)的方法,涉及C#操作foreach實現(xiàn)遍歷堆棧的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論