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 TypePointcut ImplementsType:’System.Collections.IEnumerable’
ImplementsType:(Name:‘Repository’|Namespace:‘.DataContexts’) AssignableToType TypePointcut AssignableToType:(‘System.Collections.’&Interface)
AssignableToType:Namespace:‘System.Collections.’ HasMethod MethodPointcut HasMethod:Name:‘Get’
HasMethod:(Public&Args(‘System.Int32’) HasProperty PropertyPointcut HasProperty:Name:’Length’
HasProperty:Type:Implements:’.Service’ HasField FieldPointcut HasField:Name:(‘_createdDate’|‘_entryDate’)
HasField:((Public&Static)|Protected) ThisAspect (none) ThisAspect
Implements:ThisAspect
Namespace:’Sheep.’&!ThisAspect HasCustomAttributeType TypePointcut HasCustomAttributeType:Impwww.visa158.comlementsType:’BindableAttribute’ InheritsType TypePointcut 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’ ?
特性植入示列:
一、新建特性
publicclassLogAttribute:Attribute
{
publicstringName{get;set;}
publicLogAttribute(stringname)
{
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(){www.hunanwang.net}
?
??????[Around("PublicMethods",Priority=100)]
??????public?object?LogAroundMethod(MethodJointPointjp)
??????{
?
??????????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?(Exceptione)
??????????{
?
??????????????throw;
??????????}
??????}
??}
多个特性注入顺序以:Priority属性值控制优先级较低的值;
|
|