是否有一种方法可以拦截一些方法调用,而不需要对方法本身进行任何代码更改?
我不需要在运行时注入任何自定义行为,只需要向现有项目添加自定义性能日志。
你想要面向方面编程
有四种主要的AOP风格
- 基于AOP的运行时
- 运行时子类/虚方法AOP
- 后编译将编织AOP
- 预编译源代码AOP
RealProxy
以上是按照执行速度(从最慢到最快)排序的。注意最后两个"应该"是相同的速度。然而,我希望编译器产生的IL比编译后的IL编织更好。
第一个阵营通常包括IOC容器,因为它们非常适合这种模式,包括但不限于- 统一
- 春天。净
- 城堡。温莎
- Postsharp表达
第二个阵营,是相当罕见的,我能想到的唯一的项目是实体框架(它使用它来延迟加载,但它是不可扩展的,不能自定义)。
第三个阵营也相当少,因为这种技术非常复杂和困难。这是通过在编译后编辑dll程序集来添加所需的额外代码来实现的。
- Postsharp Pro
- Mono。塞西尔
- Fody(单声道)塞西尔包装)
最后一个阵营相对较新。这么新,事实上,唯一真正进入的是实验性的MS Roslyn。这实际上是一个c#编译器。所以…是的…真神奇。
现在,如果您在性能关键代码中遇到真正巨大的性能问题,我建议使用Fody。最棒的是,它是免费的(不像Postsharp Pro),它使用nuget,并且在Fody.MethodTimer中已经有一个性能工具。
我已经成功地使用了Castle DynamicProxy。它比成熟的AOP框架更轻量级,并且可以在没有IoC容器的情况下使用。
你可以看看面向方面编程,看看它是否适合你的情况。
例如:http://docs.castleproject.org/Default.aspx?Page=Introduction-to-AOP-With-Castle& NS = Windsor& AspxAutoDetectCookieSupport = 1
http://fgheysels.blogspot.be/2006/11/aspect-oriented-programming-in-net.html你可以使用任何AOP框架,比如Spring . net或Unity,在方法执行之前或之后拦截调用。因此,您不需要更改方法代码。
您要找的是Fody: https://github.com/fody
它是开源的,稳定的,并且为不同的AOP用例提供了许多插件。我在一个巨大的商业应用中使用它,它工作得非常好。安装和配置是超级容易,并在几分钟内通过nuget完成。
- PropertyChanged:(在编译时将INotifyPropertyChanged代码注入属性)
- 另一个(通过静态类和一些IL操作简化日志记录)
- 方法定时器(注入一些非常基本的方法计时代码)
- …还有更多!
需求,示例和文档可以在fodys github页面找到。
使用PostSharp
[Serializable]
public class LogPerformance : OnMethodBoundaryAspect
{
[NonSerialized]
Stopwatch _stopWatch;
public override void OnEntry(MethodExecutionArgs args)
{
_stopWatch = Stopwatch.StartNew();
base.OnEntry(args);
}
public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
{
Console.WriteLine(string.Format("[{0}] took {1} ms to execute",
new StackTrace().GetFrame(1).GetMethod().Name,
_StopWatch.ElapsedMilliseconds));
base.OnExit(args);
}
}
在函数中使用aspect:
[LogPerformance]
static void LongRunningCalc()
{
//Your Code goes here
}
简化自:http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS