如何为包含近 7000 个 public 方法的 class 有效地创建动态代理?
How to create a dynamic proxy efficiently for a class containing almost 7000 public methods?
我有一个 class 是用近 7000 种方法自动生成的(不管内容或原理)。我想为它创建一个动态代理。
我知道有两个选择:
- 运行时代理使用
RealProxy.GetTransparentProxy()
- 在运行时使用
Castle.DynamicProxy.ProxyGenerator
发出的已编译代理
我想探讨第二种选择。所以这是我的代码:
public class DynamicProxyFactory
{
public static readonly DynamicProxyFactory Instance = new DynamicProxyFactory();
private readonly ProxyGenerator m_generator;
private DynamicProxyFactory()
{
m_generator = new ProxyGenerator();
}
public TInterface GetProxy<TInterface>(TInterface target, IInterceptor interceptor)
{
Assert.IsTrue(typeof(TInterface).IsInterface);
var sw = Stopwatch.StartNew();
try
{
return (TInterface) m_generator.CreateInterfaceProxyWithTargetInterface(typeof(TInterface), target, interceptor);
}
finally
{
Trace.WriteLine($"Dynamic proxy generation tool {sw.Elapsed}");
}
}
}
该代码有效,但生成代理的前期成本相当高 - 只需几分钟。我懂了,7000个方法可不是闹着玩的
我有哪些提高性能的选择?毕竟,并不是所有的 7000 个方法都被一次调用。因此,如果我能够按需延迟生成代理方法,那将是一个巨大的胜利。可能吗?我在这里遗漏了什么(除了目前已知的 7,000 种方法之外)?
也许我应该使用不同的代理实现?
到目前为止,我的第一个建议是停止使用生成的代码(特别是如果它创建了一个 7000 方法的怪异)。说真的。
否则,我的第二个建议是尝试通过扩展生成的代码来实现您的实际目标,而不是将其包装在代理中。它几乎肯定会产生更好的结果(性能、可维护性等)
否则,如果您真的打算使用 DP,则可能需要查看在构建时生成代理并保留代理程序集。 I wrote a tutorial about it years ago。 API 现在可能略有不同,但基本结构和思想是相同的。
我有一个 class 是用近 7000 种方法自动生成的(不管内容或原理)。我想为它创建一个动态代理。
我知道有两个选择:
- 运行时代理使用
RealProxy.GetTransparentProxy()
- 在运行时使用
Castle.DynamicProxy.ProxyGenerator
发出的已编译代理
我想探讨第二种选择。所以这是我的代码:
public class DynamicProxyFactory
{
public static readonly DynamicProxyFactory Instance = new DynamicProxyFactory();
private readonly ProxyGenerator m_generator;
private DynamicProxyFactory()
{
m_generator = new ProxyGenerator();
}
public TInterface GetProxy<TInterface>(TInterface target, IInterceptor interceptor)
{
Assert.IsTrue(typeof(TInterface).IsInterface);
var sw = Stopwatch.StartNew();
try
{
return (TInterface) m_generator.CreateInterfaceProxyWithTargetInterface(typeof(TInterface), target, interceptor);
}
finally
{
Trace.WriteLine($"Dynamic proxy generation tool {sw.Elapsed}");
}
}
}
该代码有效,但生成代理的前期成本相当高 - 只需几分钟。我懂了,7000个方法可不是闹着玩的
我有哪些提高性能的选择?毕竟,并不是所有的 7000 个方法都被一次调用。因此,如果我能够按需延迟生成代理方法,那将是一个巨大的胜利。可能吗?我在这里遗漏了什么(除了目前已知的 7,000 种方法之外)? 也许我应该使用不同的代理实现?
到目前为止,我的第一个建议是停止使用生成的代码(特别是如果它创建了一个 7000 方法的怪异)。说真的。
否则,我的第二个建议是尝试通过扩展生成的代码来实现您的实际目标,而不是将其包装在代理中。它几乎肯定会产生更好的结果(性能、可维护性等)
否则,如果您真的打算使用 DP,则可能需要查看在构建时生成代理并保留代理程序集。 I wrote a tutorial about it years ago。 API 现在可能略有不同,但基本结构和思想是相同的。