首页 > 代码库 > .NET中AOP方便之神SheepAspect

.NET中AOP方便之神SheepAspect

 

SheepAspect 简介以及代码示列:

 

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

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

技术分享

技术分享

下面开始代码实现之旅:

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

技术分享

二、NuGet上搜索SheepAspect进行安装

技术分享

三、安装完毕后的样子

技术分享

技术分享

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

技术分享

"saql":

CriteriaArgumentExamples
Namestring
  • 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

    public class TestClass    {        [Log("获取的第一个方法")]        public string Get()        {            return "test1";        }        public string Get2()        {            return "test2";        }    }

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

技术分享

四:编写测试代码:

技术分享

技术分享

技术分享技术分享

 输出结果:

 技术分享

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

技术分享

 

 输出结果:

技术分享

 

获取特性的属性:

  [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/ 
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。如有特殊需求请与本人联系!

433685124QQ群

.NET中AOP方便之神SheepAspect