Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为一个包含近7000个公共方法的类高效地创建动态代理?_C#_Proxy_Castle Dynamicproxy - Fatal编程技术网

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

C# 如何为一个包含近7000个公共方法的类高效地创建动态代理?,c#,proxy,castle-dynamicproxy,C#,Proxy,Castle Dynamicproxy,我有一个类,它是自动生成的,几乎有7000个方法(不管是内容还是原理)。我想为它创建一个动态代理 我知道有两种选择: 使用RealProxy.GetTransparentProxy()运行时代理 在运行时使用Castle.DynamicProxy.ProxyGenerator发出的编译代理 我想探讨第二种选择。下面是我的代码: public class DynamicProxyFactory { public static readonly DynamicProxyFactory Ins

我有一个类,它是自动生成的,几乎有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}");
            }
        }
    }
    
    公共类DynamicProxy工厂
    {
    公共静态只读DynamicProxyFactory实例=新建DynamicProxyFactory();
    专用只读代理生成器m_生成器;
    私有动态工厂()
    {
    m_生成器=新代理生成器();
    }
    公共TInterface GetProxy(TInterface目标,IInterceptor拦截器)
    {
    Assert.IsTrue(typeof(TInterface).IsInterface);
    var sw=Stopwatch.StartNew();
    尝试
    {
    返回(TInterface)m_生成器。CreateInterfaceProxy与TargetInterface(typeof(TInterface)、目标、拦截器);
    }
    最后
    {
    WriteLine($“动态代理生成工具{sw.appeased}”);
    }
    }
    }
    
    代码是可以工作的,但是生成代理的前期成本相当高——它只需几分钟。我明白,7000种方法不是开玩笑

    我可以选择哪些方法来提高性能?毕竟,并不是所有的7000个方法都被一次调用。因此,如果我能按需惰性地生成代理方法,那将是一个巨大的胜利。可能吗?我在这里遗漏了什么(除了拥有7000个方法,这是目前已知的)?
    也许我应该使用不同的代理实现?

    到目前为止,我的第一个建议是停止使用生成的代码(特别是如果它创建了一个7000方法怪物)。真的

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


    如果不能做到这一点,那么如果您真的开始使用DP,您可能希望在构建时生成代理并持久化代理程序集。API现在可能略有不同,但基本结构和思想是相同的。

    问题在于C代码是从包含Sql查询的XML规范生成的。它是一个生成执行Sql查询和相应DTO的代码的系统。XML是一个巨大的整体,包含大约3000多个查询。方法的数量增加了一倍,因为对于每个查询,都会生成阻塞方法和异步方法。以一种有意义的方式分割XML是相当痛苦的。我们总有一天会这样做,不确定我现在是否会得到批准。我不知道您正在使用什么codegen工具,但解决这个问题的第一步可能是让生成的代码包含一些钩子,可以让您执行计划执行的操作,而无需将其包装在代理中。很多codegen工具都有这样的功能。我已经考虑过了,我同意,这是最好的选择。不幸的是,它是一个内部代码,所以没有预演挂钩。但是我认为我最好修改我们的codegen来生成代理类型。但在此期间,我没有这样的东西。