我希望了解C#自定义属性和AOP框架(如PostSharp)的使用区别。如何选择它们之间的差异?
自定义属性是在代码元素上声明元数据的方式,其他系统元素可以理解它,包括编译器、AOP框架、验证引擎等...
PostSharp执行IL(中间语言)织入,例如,在编译后,它基于配置/属性在程序集中某些点注入IL。例如,您可以向方法添加自定义属性,并在编译期间,PostSharp将编写IL以拦截此方法并在运行时为您提供行为。
https://www.postsharp.net/aop.net/msil-injection
PostSharp是实现AOP的一种方式,还有许多其他方式,包括动态代理(例如Castle.Core),它可以通过提供要扩展的类的动态子类来在运行时拦截方法。
在这两个示例中,属性可以为您提供配置这些功能的手段。
例如,您有一个方法:
public int Add(int x, int y)
{
return x + y;
}
如果您想为该方法提供日志记录或诊断功能,可以手动添加以下代码(log是一个虚构的日志记录API):
public int Add(int x, int y)
{
log.Enter("Add", x, y);
log.Leave("Add", x, y);
return x + y;
}
当考虑方法的复杂性和单一职责原则时,您会分散方法的目的并开始让情况变得混乱。
理想情况下,您希望能够在运行时/编译时添加此行为,并且通常不仅适用于单个方法,这就成为一个横切关注点,例如您想要记录所有内容。
因此,您最终需要一种通知系统的方式,告诉它您要将日志应用于Add方法。其中一种方便的方法是使用属性对方法进行标记:
[Log]
public int Add(int x, int y)
{
return x + y;
}