gpt4 book ai didi

c# - 如何使用 CaSTLe.DynamicProxy 只拦截基类方法

转载 作者:行者123 更新时间:2023-11-30 15:55:34 24 4
gpt4 key购买 nike

我有 2 个类,一个用于访问数据库,另一个子类使用缓存。我可以更改这两个类的源代码,但是有许多类具有不同的结构,所以我正在寻找一种方法来制作通用解决方案,这将帮助我只拦截我用 Attribute 标记的方法或否则。

举个例子

public class BaseClass
{
[MyAttribute]
public virtual MyEntity[] GetAll() {}
[MyAttribute]
public virtual MyEntity GetByKey(int key) {}
[MyAttribute]
public virtual void GetByName(string name) {}
}

public class ChildClass : BaseClass
{
public override MyEntity GetByKey(int key)
{
if(key > 100)
return GetCachedEntity(key);
return base.GetByKey(key);
}
}

public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Here I can check any required conditions to decide on the way of processing
var myCondition = invocation.Method.GetCustomAttributes(false).Any(a => a is MyAttribute);
if(myCondition)
{
// extra logic for marked methods
}

invocation.Proceed();
}
}

public static class MyProxyFactory
{
private static readonly ProxyGenerator proxyGenerator = new ProxyGenerator();

// here is my generic proxy factory which I want to use for creating proxies for ChildClass objects and another objects that contains similar logic
public static TInterface CreateProxy<TInterface>(TInterface concreteObject)
where TInterface : class
{
var proxy = proxyGenerator.CreateInterfaceProxyWithTarget(concreteObject, ProxyGenerationOptions.Default, new MyInterceptor());
return proxy;
}
}

[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class MyAttribute : Attribute {}

我正在尝试将 invocation.Method.GetCustomAttributes() 用于 myCondition 并仅标记基类方法,但问题是当 ChildClass. GetByKey() 调用它不使用 MyInterceptor.Intercept() 方法拦截的基类方法。

对于这个例子,我可以用分解代替继承,但是我需要在 ChildClass 中实现 GetAllGetByName 方法,这解决方案不会是通用的。

如何更改 ProxyGenerator 设置或 CreateProxy() 方法来解决我的问题?

var realObject = new ChildClass();
var proxyObject = MyProxyFactory.CreateProxy(realObject);

// extra logic should be executed
proxyObject.GetAll();

// extra logic should be executed
proxyObject.GetByKey(99);

// extra logic should not be executed
proxyObject.GetByKey(101);

最佳答案

base.Method 调用有意不尝试查找比 this 的基类继承关系更靠后的任何方法重载。代理不执行花哨的魔法,它覆盖子类中的方法并依赖于虚拟调用来访问代理而不是它的基本实现。或者如果它是一个包装代理,它只拦截外部调用 - 我不知道你使用的代理类型的详细信息。

所以基本上,您不能指望在编写 base.Method 后会发生任何子类魔法。如果您需要在层次结构内部的父子交互中进行拦截,则需要重新审视您的设计方法。

关于c# - 如何使用 CaSTLe.DynamicProxy 只拦截基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48447565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com