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

时间:2019-07-03 16:55:19

标签: c# proxy castle-dynamicproxy

我有一个可以自动使用近7000种方法生成的类(不必管内容或原理)。我想为其创建一个动态代理。

我知道两个选择:

  1. 使用RealProxy.GetTransparentProxy()的运行时代理
  2. 在运行时使用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种方法的事实(目前已提供)之外)? 也许我应该使用其他代理实现?

1 个答案:

答案 0 :(得分:2)

到目前为止,我的第一个建议是停止并尝试脱离使用生成的代码(尤其是如果它创建了7000个方法的怪兽)。认真地。

如果没有,我的第二个建议是尝试通过扩展生成的代码而不是将其包装在代理中来完成您的实际目标。几乎可以肯定会产生更好的结果(性能,可维护性等)

否则,如果您真的想使用DP,则可能需要考虑在构建时生成代理并保留代理程序集。 I wrote a tutorial about it years ago。现在的API可能略有不同,但基本结构和思想是相同的。