C#中使用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();
        }
    }

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#自定义日志记录

    废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可. 默认保存在:项目/temp/log /// <summary> /// 日志类 /// </summary> /// <remarks>Creator: v-lxh CreateTime: 2016/7/26 11:18:09</remarks> /// <Description></Description> public class L

  • C#使用log4net记录日志

    一.Nuget安装log4net --> Install-Package log4net 二.在AssemblyInfo.cs文件中添加log4net.dll的参数. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)] 三.右击项目→添加→新建项→xxx配置文件(web或者w

  • C#使用Log4.net记录日志文件

    一.简介 1.1 Log4.net优点 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日志记录往往是软件开发周期中的重要组成部分.它具有以下几个优点: 1.它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 2.一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预. 3.另外,日志信息可以输出到不

  • C# 使用Log4net添加日志记录的方法

    目录 一.Log4net 二.使用日志库 1. 添加库 2. 配置log4net 3. 使用log4net 4. 结果 一.Log4net 官方网站:https://logging.apache.org/log4net/. 下载二进制dll库: 包中提供了针对各个版本的dll库: 二.使用日志库 1. 添加库 复制对应的库文件到项目中: 2. 配置log4net 2.1. 创建配置文件 添加后修改该文件设置: 2.2. 修改配置文件 替换文件为以下内容,设置为日志文件输出: <?xml vers

  • c#日志记录帮助类分享

    复制代码 代码如下: public class LogHelper   {       private static void Info(string category, int priority, TraceEventType severity, string message)       { IDictionary<string, object> dic = new Dictionary<string, object>();           dic.Add("属性

  • C#记录消息到日志文件的方法

    本文实例讲述了C#记录消息到日志文件的方法.分享给大家供大家参考.具体实现方法如下: public void LogMessageToFile(string msg) { System.IO.StreamWriter sw = System.IO.File.AppendText("log.txt"); try { string logLine = System.String.Format("{0:G}: {1}.", System.DateTime.Now, msg

  • C#中四步轻松使用log4net记录本地日志的方法

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件 如下图: 选择安装的项目(哪个类库中需要记录日志就勾选上) 第二步:打开配置文件 WinFrom就是 App.config Web就是 web.config 将以下配置信息加入 <configSections>

  • C#使用log4net记录日志的方法步骤

    一.Nuget安装log4net --> Install-Package log4net 二.在AssemblyInfo.cs文件中添加log4net.dll的参数. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true 三.右击项目→添加→新建项→xxx配置文件(web或者win

  • c#程序定期把内存信息记录到log日志示例

    设立一个定时器tmrMonitor,该定时器会在程序运行时不断把程序的占用内存和占用线程数写到LOG\MEM目录下.我设置的定时器间隔是3000毫秒,记录后的信息可以用来分析一段时间内程序的运行状况,比如内存泄漏问题. 复制代码 代码如下: /// <summary>/// Timer组件tmrMonitor的Tick事件/// </summary>/// <param name="sender"></param>/// <para

  • C#实现线程安全的简易日志记录方法

    一般在实际项目的开发中,会要求涉及日志记录的问题,比较常用的有Log4Net,NLog等几个,而小项目小工具的话,则无需费此大驾.而譬如串口开发的话,需要记录串口过来的数据等等,这时候就要考虑日志记录上线程的问题.对此,为了方便后续使用,封装了下代码: using System; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; namespace CSharpUtilHel

随机推荐