转载https://www.cnblogs.com/InCsharp/p/5902133.html
SheepAspect 简介以及代码示列:
SheepAspect是一个AOP框架为.NET平台,深受AspectJ。它静织目标组件作为一个编译后的任务(编译时把AOP代码植入)。
多有特性时,可根据参数值设置先后进入顺序
下面开始代码实现之旅:
一、新建控制台程序:方案名称:SheepAectTest
二、NuGet上搜索SheepAspect进行安装
三、安装完毕后的样子
成员的切入点类型(SelectMethdos 以下图等):
"saql":
Criteria | Argument | Examples |
Name | string |
|
Namespace | string |
|
ImplementsType | Type Pointcut |
|
AssignableToType | Type Pointcut |
|
HasMethod | Method Pointcut |
|
HasProperty | Property Pointcut |
|
HasField | Field Pointcut |
|
ThisAspect | (none) |
|
HasCustomAttributeType | Type Pointcut |
|
InheritsType* | Type Pointcut |
|
Interface* | (none) |
|
Abstract* | (none) |
|
ValueType* | (none) |
|
Class* | (none) |
|
特性植入示列:
一、新建特性
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属性值控制优先级较低的值;