我知道检测是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。
我想知道这是否只是一个“跟踪”选项,硬编码到 CLR 中以仅添加跟踪代码,或者是否能够向方法中添加任何代码?
例如,我想在某个类中的每个方法调用的开头检查一个条件(比如权限)。我可以通过在执行时将动态代码添加到方法的开头来做到这一点吗?
我不确定这个跟踪“仪器”是如何工作的,但我想知道这是否也可以用于其他目标。
我知道检测是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。
我想知道这是否只是一个“跟踪”选项,硬编码到 CLR 中以仅添加跟踪代码,或者是否能够向方法中添加任何代码?
例如,我想在某个类中的每个方法调用的开头检查一个条件(比如权限)。我可以通过在执行时将动态代码添加到方法的开头来做到这一点吗?
我不确定这个跟踪“仪器”是如何工作的,但我想知道这是否也可以用于其他目标。
正如其他人所回答的那样,此类横切关注点通常通过面向方面的编程(AOP) 来解决。
执行 AOP 的一种方法是使用 PostSharp 等工具进行代码检测,但另一种不需要额外工具的替代方法是利用依赖注入(DI) 和装饰器设计模式。
假设您的代码使用了 IFoo 接口:
public interface IFoo
{
string GetStuff(string request);
}
您可能MyFoo
对 IFoo 有一个具体的实现,但您也可以编写一个或多个处理不同方面的装饰器:
public class AdministratorGuardingFoo : IFoo
{
private readonly IFoo foo;
public AdministratorGuardingFoo(IFoo foo)
{
if (foo == null)
{
throw new ArgumentNullException("foo");
}
this.foo = foo;
}
public string GetStuff(string request)
{
new PrincipalPermission(null, "Administrator").Demand();
return this.foo.GetStuff(request);
}
}
您现在可以(让您的 DI 容器)包装MyFoo
在AdministratorGuardingFoo
. 所有消费的消费者IFoo
都不会注意到差异。
我知道PostSharp允许您通过属性向现有方法添加“方面”,以便您可以将进入/退出跟踪添加到您的方法中
CLR 允许通过消息接收器进行方法拦截。