如何为包含近 7000 个 public 方法的 class 有效地创建动态代理?

How to create a dynamic proxy efficiently for a class containing almost 7000 public methods?

我有一个 class 是用近 7000 种方法自动生成的(不管内容或原理)。我想为它创建一个动态代理。

我知道有两个选择:

  1. 运行时代理使用 RealProxy.GetTransparentProxy()
  2. 在运行时使用 Castle.DynamicProxy.ProxyGenerator
  3. 发出的已编译代理

我想探讨第二种选择。所以这是我的代码:

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 现在可能略有不同,但基本结构和思想是相同的。