用常见的拦截策略是不可能的。
但是大多数在编译时工作的 AOP 框架都可以做到。(例如:PostSharp)
我在一个开源的NConcern AOP 框架上工作。
这是一个简单的 .NET AOP 框架,允许在运行时通过交换方法进行拦截。
它可以为虚拟方法、非虚拟方法和静态方法完成它的工作,而无需任何工厂模式和继承需求。
我的建议是避免使用 AOP 来“猴子补丁”,静态方法必须只是“单例用法快捷方式”,而不是主流。
在您的情况下,使用带有静态方法的单例模式作为快捷方式和 DI(依赖注入)来启用简单的代理模式会更容易。
例子 :
界面
public interface IRepository
{
IQueryable<T> Query<T>()
where T : class;
}
使用 DI 的糖(通过工厂)
static public class Repository
{
//You can wrap the interface (proxy) here if you need...
static private readonly IRepository m_Repository = MyDIFactory.Import<IRepository>();
static public IQueryable<T> Query<T>()
where T : class
{
return Repository.m_Repository.Query<T>();
}
}
用法
Repository.Query<T>().CacheForMinutes(10);
Repository.Query<T>().LogWhenErrorOccurs();