.NET中AOP方便之神SheepAspect

SheepAspect 简介以及代码示列:

 

SheepAspect是一个AOP框架为.NET平台,深受AspectJ。它静织目标组件作为一个编译后的任务(编译时把AOP代码植入)。

多有特性时,可根据参数值设置先后进入顺序

下面开始代码实现之旅:

一、新建控制台程序:方案名称:SheepAectTest

二、NuGet上搜索SheepAspect进行安装

三、安装完毕后的样子

成员的切入点类型(SelectMethdos 以下图等): 

"saql":

Criteria Argument Examples
Name string
  • Name: ‘*Customer’
  • Name: (‘*Service’ | ‘*Repository’)
Namespace string
  • !Namespace: ‘System.*’
ImplementsType Type Pointcut
  • ImplementsType:’System.Collections.IEnumerable’
  • ImplementsType: (Name: ‘*Repository’ | Namespace: ‘*.DataContexts’)
AssignableToType Type Pointcut
  • AssignableToType:(‘System.Collections.*’ & Interface)
  • AssignableToType: Namespace: ‘System.Collections.*’
HasMethod Method Pointcut
  • HasMethod: Name: ‘Get*’
  • HasMethod: (Public & Args(‘System.Int32’)
HasProperty Property Pointcut
  • HasProperty:Name:’Length’
  • HasProperty:Type:Implements:’*.*Service’
HasField Field Pointcut
  • HasField:Name:(‘_createdDate’ | ‘_entryDate’)
  • HasField:((Public & Static) | Protected)
ThisAspect (none)
  • ThisAspect
  • Implements:ThisAspect
  • Namespace:’Sheep.*’ & !ThisAspect
HasCustomAttributeType Type Pointcut
  • HasCustomAttributeType:ImplementsType:’BindableAttribute’
InheritsType* Type Pointcut
  • InheritsType:Namespace:’System.Collections’
Interface* (none)
  • Interface
  • !Interface
Abstract* (none)
  • Abstract & Name:’*Strategy’
ValueType* (none)
  • ValueType & HasMethod:Name:’Equals’
Class* (none)
  • Class & Implements:’Sheep.Irepository’

 

特性植入示列:

一、新建特性

复制代码
   public class LogAttribute:Attribute
    {
        public string Name { get; set; }

        public LogAttribute(string name)
        {
            Name = name;
        }
    }
复制代码

二、新建一个测试类TestClass.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  TestClass
{
     [Log( "获取的第一个方法" )]
     public  string  Get()
     {
         return  "test1" ;
     }
 
     public  string  Get2()
     {
         return  "test2" ;
     }
}

三、更改SampleAspect为:HasCustomAttributeType:'SheepAectTest.Attr.LogAttribute'   >  命名空间+类名

四:编写测试代码:

 输出结果:

 

如果我们在AOP中更改结果呢?

 

 输出结果:

 

获取特性的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[Aspect]
   public  class  SampleAspect
   {
       [SelectMethods( "HasCustomAttributeType:'SheepAectTest.Attr.LogAttribute'" )]
       public  void  PublicMethods() { }
 
       [Around( "PublicMethods" , Priority = 100)]
       public  object  LogAroundMethod(MethodJointPoint jp)
       {
 
           try
           {
               var  log = (LogAttribute)jp.Method.GetCustomAttributes( typeof (LogAttribute),  false )[0];
               //这样可以获取属性名称:log.Name;
               //jp.Args  -> 包含传递参数
               var  result = jp.Execute();
 
               if  (jp.Method.ReturnType ==  typeof ( void ))
                   result =  "{void}" ;
 
               result =  "AOP更改结果" ;
               return  result;
           }
           catch  (Exception e)
           {
 
               throw ;
           }
       }
   }

  

多个特性注入顺序以:Priority属性值控制优先级较低的值;

 

作者:疯狂的果子
来源:http://incsharp.cnblogs.com/ 
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。如有特殊需求请与本人联系!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值