.NET中AOP方便之神SheepAspect

来源:互联网 发布:中国网络研究院 待遇 编辑:程序博客网 时间:2024/05/19 17:56

SheepAspect 简介以及代码示列:

 

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

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

下面开始代码实现之旅:

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

二、NuGet上搜索SheepAspect进行安装

三、安装完毕后的样子

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

"saql":

CriteriaArgumentExamplesNamestring
  • Name: ‘*Customer’
  • Name: (‘*Service’ | ‘*Repository’)
Namespacestring
  • !Namespace: ‘System.*’
ImplementsTypeType Pointcut
  • ImplementsType:’System.Collections.IEnumerable’
  • ImplementsType: (Name: ‘*Repository’ | Namespace: ‘*.DataContexts’)
AssignableToTypeType Pointcut
  • AssignableToType:(‘System.Collections.*’ & Interface)
  • AssignableToType: Namespace: ‘System.Collections.*’
HasMethodMethod Pointcut
  • HasMethod: Name: ‘Get*’
  • HasMethod: (Public & Args(‘System.Int32’)
HasPropertyProperty Pointcut
  • HasProperty:Name:’Length’
  • HasProperty:Type:Implements:’*.*Service’
HasFieldField Pointcut
  • HasField:Name:(‘_createdDate’ | ‘_entryDate’)
  • HasField:((Public & Static) | Protected)
ThisAspect(none)
  • ThisAspect
  • Implements:ThisAspect
  • Namespace:’Sheep.*’ & !ThisAspect
HasCustomAttributeTypeType 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/ 
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。如有特殊需求请与本人联系!
1 0