zoukankan      html  css  js  c++  java
  • 【转】IL编织 借助PostSharp程序集实现AOP

    ref:   C# AOP实现方法拦截器 

    在写程序的时候,很多方法都加了。日志信息。比如打印方法开始,方法结束,错误信息,等等。

    由于辅助性功能的代码几乎是完全相同的,这样就会令同样的代码在各个函数中出现,引入了大量冗余代码。

    最后找到了AOP解决方案,分享出来。供大家参考。

    实现步骤

    一、下载安装

    PostSharp-1.5.6.629-Release-x86.msi 或者 PostSharp-1.5.7.1081-Release-x64.msi 具体根据自己电脑来。

    安装的时候记得先退出自己的 Microsoft Visual Studio
    下载地址: http://www.postsharp.net/downloads/postsharp-1.5/sp-1


    二、在项目中添加引用


    三、实例

      [Serializable] //必须加入这个
      [AttributeUsage(AttributeTargets.Method,AllowMultiple=true,Inherited=true)] //设置类的访问访问
      public sealed class LoggingAttribute:OnMethodBoundaryAspect
      {
    
        public string BusinessName { get; set; }
    
    
        /// <summary>
        /// 方法进入时执行
        /// </summary>
        /// <param name="eventArgs"></param>
        public override void OnEntry(MethodExecutionEventArgs eventArgs)
        {
    
          Console.WriteLine("---------------方法:" + eventArgs.Method.Name+"开始--------------");
        }
    
        /// <summary>
        /// 方法退出时执行
        /// </summary>
        /// <param name="eventArgs"></param>
        public override void OnExit(MethodExecutionEventArgs eventArgs)
        {
          Console.WriteLine("---------------方法:" + eventArgs.Method.Name + "结束--------------");
        }
    
    
        /// <summary>
        /// 错误的时候执行
        /// </summary>
        /// <param name="eventArgs"></param>
        public override void OnException(MethodExecutionEventArgs eventArgs)
        {
          base.OnException(eventArgs);
        }
    
        //还有别的方法自己研究
    
      }

    注意点:类必须序列化 需要加 [Serializable]    类要配置 Attribute  设置的他的调用方式

    四 调用 

    在需要调用的 方法前面加入方法的 Attribute 就行了

        /// <summary>
        /// 调用事例1
        /// </summary>
        [Logging()]
        void debugInfo() {
    
          for (int i = 0; i < 3;i++ )
          {
             
            Console.WriteLine("i="+i);
          }
        }
    
    
        /// <summary>
        /// 调用事例2 ,可以给属性赋值
        /// </summary>
        [Logging(BusinessName="aaa")]
        void debugError() {
          for (int i = 0; i < 3; i++)
          {
    
            Console.WriteLine("i=" + i);
          }
        
        }

    五、测试结果

  • 相关阅读:
    F2E Tool(前端工程师的工具箱)
    SQLServer 语句存档整理
    MySQL DATE_FORMAT() 函数
    sqlserver 自连接 生成一列数据
    mysql存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试
    好书推荐
    Flashfxp 3.4的注册码
    mysql事务处理
    mysql 时间函数 格式化
    【转】PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码
  • 原文地址:https://www.cnblogs.com/leenice/p/5212134.html
Copyright © 2011-2022 走看看