文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中使用MicrosoftUnity记录日志

2024-04-02 19:55

关注

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

以上,还是存在一些问题:

Microsoft Unity的出现就是解决以上问题。

引用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>

以上,

客户端调用

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯