需要记录日志的地方包括:进入方法的时候,传参的时候,统计执行时间,方法返回参数的时候,退出语句块的时候,出现异常的时候,等等。先来体验不使用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

使用Microsoft Unity进行日志记录的更多相关文章

  1. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  2. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  3. RMS Server打开或关闭日志记录

    原文: https://technet.microsoft.com/zh-cn/library/cc732758 在 Active Directory Rights Management Servic ...

  4. PHP日志记录规范PSR-3

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  5. (转)解释一下SQLSERVER事务日志记录

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...

  6. 警告: 程序集绑定日志记录被关闭(IIS7 64位系统)

    部署一个.NET程序在IIS7服务器,出现如下信息: 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: S ...

  7. 解释一下SQLSERVER事务日志记录

    解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...

  8. IIS 7完全攻略之日志记录配置(摘自网络)

    IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...

  9. 内存中OLTP(Hekaton)里的事务日志记录

    在今天的文章里,我想详细讨论下内存中OLTP里的事务日志如何写入事务日志.我们都知道,对于你的内存优化表(Memory Optimized Tables),内存中OLTP提供你2个持久性(durabi ...

随机推荐

  1. Linux下fastbin利用小结——fd覆盖与任意地址free(House of Spirit)

    linux下的fastbin是ctf中pwn题的重点出题点.去年(2015)中,XCTF就有两站是使用fastbin的利用作为pwn400的压轴题来出现,这也是我刚开始接触fastbin的利用,参考了 ...

  2. java通过POI和easypoi实现Excel的导出

    前言 在工作经常会遇到excel导出报表的功能,自己也做过一些,然后在项目里看到同事封装的一个excel导出工具类,着实不错,拿来分享一下.然后,又在网上看到一个使用easypoi实现cxcel导出的 ...

  3. android拾遗——四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  4. 使用ngx_lua构建高并发应用

    http://blog.csdn.net/chosen0ne/article/details/7304192

  5. logstash部署及基本语法(二)

    一.logstash介绍 Logstash是一个开源的数据收集引擎,可以水平伸缩,而且logstash是整个ELK当中拥有最多插件的一个组件,其可以接收来自不同源的数据并统一输入到指定的且可以是不同目 ...

  6. Gitlab Issue Tracker and Wiki(一)

    本节内容: 创建第一个问题 创建第一个合并请求 接受合并请求 工作里程碑 在提交中引用问题 创建维基百科页 使用Gollum管理维基百科 一. 创建问题 1. 登陆Gitlab服务器 2. 切换到想要 ...

  7. 7-1 FireTruck 消防车 uva208

    题意: 输入一个n <=20 个结点的无向图以及某个结点k   按照字典序从小到大顺序输出从结点1到结点k的所有路径  要求结点不能重复经过 标准回溯法 要实现从小到大字典序 现在数组中排序好即 ...

  8. 终端(terminal)、tty、shell、控制台(console)、bash之间的区别与联系

    1.终端(terminal) 终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是 ...

  9. vim选中多行复制粘贴

    1.按v进入可视模式,移动光标选中需要复制的行: 2.使用y复制选中块到缓冲区(剪切选中块使用d): 3.将光标移动到粘贴的位置,按p即可. 复制多行并粘贴到指定位置后,可能需要进行多行缩进.多行缩进 ...

  10. poj1847 Tram(Dijkstra || Floyd || SPFA)

    题目链接 http://poj.org/problem?id=1847 题意 有n个车站,编号1~n,每个车站有k个出口,车站的出口默认是k个出口中的第一个,如果不想从默认出口出站,则需要手动选择出站 ...