Jef*_*eff 1 c# aop castle-dynamicproxy
我试图想出一种方法(动态或实例)方法调用可以被动态代理拦截.我想将它作为c#扩展方法实现,但坚持如何为静态方法生成动态代理.
一些用法:
Repository.GetAll<T>().CacheForMinutes(10);
Repository.GetAll<T>().LogWhenErrorOccurs();
//or
var repo = new Repository();
repo.GetAll<T>().CacheForMinutes(10);
repo.GetAll<T>().LogWhenErrorOccurs();
Run Code Online (Sandbox Code Playgroud)
我对任何图书馆(linfu,castle.dynamic proxy 2等)开放.
谢谢!
完全不可能.
事实上,代理甚至无法在所有实例方法上生成- 它们必须是虚拟的,因此代理生成器可以创建派生类并覆盖它们.
静态方法永远不是虚拟的,因此不能被代理覆盖.
(从技术上讲,非虚拟方法的解决方法是从中派生类MarshalByRefObject,但基于远程处理的解决方案是缓慢而笨重的,但仍然不支持静态方法.)
鉴于您的类已命名Repository,我将建议您改为使用这些方法实例方法.通常不应该static开始这些操作.如果你制作它们static,你会丢失很多东西:松耦合,模拟,依赖注入,一定数量的单元可测试性,以及 - 正如你刚刚发现的那样 - 代理和拦截.