问题标签 [dynamic-proxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1595 浏览

java - Java 动态代理

什么是 java 动态代理,那里有很多教程,但它们让我感到困惑,我们在哪里使用这个概念,任何人都用现实世界的应用程序用法来解释

0 投票
1 回答
355 浏览

c# - 生成动态程序集和类型时程序集和类名的最佳实践?

我正在使用 TypeBuilder 和 Emit 在 .NET 中生成一个动态代理,并且有很多名称正在进行 - 程序集名称、模块名称和类型名称。关于动态代理的命名或一般发出的类是否有最佳实践或一组一般的好主意?生成的代理是否应该包含名称和随机数以防止类名冲突等?

谢谢你的帮助。

0 投票
3 回答
1360 浏览

c# - 从具体类生成拦截代理?

我需要创建一个代理来拦截类中的属性。我知道如何使用 Emit 从接口创建动态代理,但是如果我没有接口怎么办?我见过使用 RealProxy 的示例(例如:Is there a way to call a method when a class of any property is set?)但是是否可以使用类型生成和发出来实现相同的目的?如果可能的话,我不希望具体类的“所有者”看到 MarshalByRefObject 的任何痕迹(见下文)......

我相信 Castle 能够做到这一点,但也许它在幕后使用 RealProxy?

0 投票
2 回答
2352 浏览

c# - 多路复用接口方法调用到单个委托和多路分解

我正在寻找的简短版本是这样的:

我正在寻找一种机制,在给定接口的情况下,它将为该接口动态生成一对类,一个多路复用器和一个多路分解器,它将调用/从以下形式的通用委托转换:object AnyCall( int method_selector, object[] arguments ). 多路复用器类将接受 AnyCall 委托作为构造时参数,并将通过将每次调用委托给委托来实现接口。多路分离器类将接受对接口的引用作为构造时参数,并将通过打开方法选择器并调用接口的适当方法来实现委托,将传递给委托的参数传递给它。

我正在寻找的长版本是这样的:

考虑以下接口:

并考虑以下实现该接口的类:

然后考虑使用上述内容的以下类:

这里没有什么花哨的。

现在让我们假设不是给 InvokeFoo() 直接引用 FooImplementation 我想在两者之间嵌入一些功能,这将允许我通过接口方法调用做一些真正有用的事情,比如,计算对接口的方法之一进行调用的次数;或者将调用转换为消息并将它们传递到驻留在不同线程上的 FooImplementation;或在不同的大陆;管他呢。当然,这个中间功能应该能够在任何接口上工作,而不仅仅是 IFooable。

为了实现这一点,我们需要一种方法将对接口的方法的调用多路复用到单个通用委托的调用中,然后将它们从调用到该委托的多路分解到接口方法调用中。我正在考虑的代表将具有以下形式:

因此,这是 IFooable 接口的多路复用器的实现:

这是 IFooable 接口的解复用器的实现:

下面是一段利用上述代码的代码,实现了与上面的 Run1() 方法完全相同的功能,不同之处在于所有调用都通过一个“AnyCall”委托:

我唯一的问题是 MuxForFooable 和 DemuxForFooable 类是手写的,而我希望它们是动态生成的。考虑以下将生成它们的模拟方法,以及将使用这些方法的一段代码:

上面的 Run3() 与上面的 Run2() 和 Run1() 具有完全相同的效果。

那么,有没有人写过或知道如何为 CreateMux() 和 CreateDemux() 写实际的实现?

您可以假设接口将仅包含方法而不包含属性,并且所有方法都将返回 void 并且不会接受任何“ref”或“out”参数。(即使我不介意允许这些事情的实现。)

那里有很多代码示例可以做类似于我想要的事情,但我发布这个问题是希望有人已经完成了我想做的事情,因为动态代码生成的主题非常棘手。

我知道我想要的可以使用现有的代理框架(如 CastleProxy)来完成,但我不想为这样一个简单的任务使用整个外部框架,也不希望使用这样的框架产生运行时开销。我查看了 CastleProxy 的源代码,试图弄清楚如何使用它的一部分来做我想做的事,但我发现它太复杂了,无法理解它。

编辑1:

六个月后,我实现了一个工具,可以满足我在这个问题中的要求。我打算发表一篇关于它的论文,但在此之前,我需要命名方面的帮助,所以我提出了另一个问题:Need help with Naming (marshaling interface calls)

同时,如果您有答案,请随时添加。

编辑2:

我决定称该工具为 intertwine” ,操作为“entwine “untwine”。如果你想了解它,这里是:michael.gr - Intertwine: Normalizing Interface Invocations

0 投票
1 回答
2328 浏览

c# - DynamicProxyFactory 使用

需要一些帮助DynamicProxyFactory,我正在使用 WCF [C#] 创建一个小应用程序,需要在运行时动态生成代理类。

我找不到任何关于如何使用它的好页面!

0 投票
1 回答
2266 浏览

.net - 在 .NET Web 应用程序中使用 Castle DynamicProxy 的性能建议

我从 Castle DynamicProxy 开始,我有这个示例来跟踪对象属性的更改。

问题:

  • 我应该缓存(在静态字段中)我在 AsTrackable() 中使用的 ProxyGenerator() 实例吗?我打算在 ASP.NET Web 应用程序中使用,但我不确定该类是否是线程安全的?创作成本高吗?
  • 如果我保留代码原样,生成的代理类型是否会被不同的 ProxyGenerator 实例重用。我阅读了缓存教程,但不确定“模块范围”是什么意思。
  • 从性能的角度来看,还有其他建议可以改进代码吗?

代码:

}

0 投票
2 回答
548 浏览

nhibernate - 使用 NHibernate 拦截器和 DynamicProxy 混合边表数据

我正在解决一个问题,其中我有许多实体,每个实体都有一个对应的一对多翻译表,它指定实体字段的本地化版本。(所有这些都是我在其上添加地图的遗留模式)。例如:

  • 事件
    • ID
  • 事件翻译
    • 事件ID
    • 语言
    • 标题
    • 其他领域

所以,如果我要用希腊语呈现我的信息,我会加入这两个表并指定 Language = 'Greek' 并拥有所有正确的东西。

我正在尝试做的是构建即时混合,将正确的数据直接合并到单个对象中,并将其作为查询结果返回,例如:

为此,我正在尝试设置一个 NHibernate 拦截器来创建 DynamicProxy mixins。除了它不起作用,我不知道为什么。这是设置,尽我所能简化它。

这是事件:

IEvenEntity列表还有一个 getter 和 setter。还有一个EventTranslation类,它超级简单,并且IEventTranslation以最明显的方式实现。

Event的流畅地图:

单独工作正常——我可以查询事件并导航到他们的翻译。我很确定映射是好的。

我的拦截器形状基于 Krzysztof Koźmic 的一个非常酷的指南,用于做一些稍微相关的事情。首先,我创建了一个将使用动态代理实现的超级接口:

这是我的 NH 拦截器。显然,我正在疯狂地黑客攻击:

其中 DynInterceptor 是一个拦截器,它实际上完成了进入关系包、获取正确的翻译并返回正确的值的工作。细节不太相关,因为它永远不会被调用。

绑定 NH 拦截器后,我看到它正在运行,实际上 NH 将强制转换IEvent正确(即至少正在创建代理)。但由于某种原因,它完全搞砸了实体的保湿:

在我看来它不起作用,因为 NH 正在使用反射来设置属性,但是当然,目标类型是错误的,因为我将 IEvent 换成了 Event。有没有办法解决这个问题?

另外,就基本方法而言,在新罕布什尔州有更好的方法吗?

0 投票
0 回答
1467 浏览

java - 将 ProxySelector 和 Authenticator 设置回它们的默认值

我的任务是为我们当前的 OSGi 项目编写自定义ProxySelector实现。为了对代理使用身份验证,我还必须编写一个自定义Authenticator

在 OSGi 包启动时设置这些自定义实现效果很好。但是 OSGi 捆绑包可以停止/卸载,这让我想到了我的问题:

如何取消设置我的实现并恢复默认 (JVM) 实现?

捆绑包启动时,我保存默认实现:

遗憾的是 Authenticator 没有getDefault()方法。

当捆绑停止时,我想像这样取消设置 ProxySelector 和 Authenticator:

但这不起作用。捆绑停止后,我无法建立任何连接。

我唯一的解释是设置defaultSelector只是传递一个参考。当我的 ProxySelector 被销毁时,这些参考点无处可去,从而导致 JVM 没有有效的 ProxySelector。我想出的最佳解决方案是克隆选择器。但是 ProxySelector 没有clone()方法。将其defaultSelector转换为一些默认实现(sun.net.spi.DefaultProxySelector)可能不是最好的解决方案,但可以工作。这可能是一个问题,因为它可能会覆盖之前设置的其他自定义实现。

那么,您对此的最佳做法是什么?

0 投票
1 回答
1602 浏览

web-services - 收到数据大小的 DynamicProxyFactory 错误

我使用 dynamicproxyfactory 以通过 wsdl 字符串路径调用任何 Web 服务。不幸的是,当 web 服务回答大量数据时,会引发异常:

System.ServiceModel.CommunicationException: Le quota de taille maximale autorisée pour les messages entrants (65536) a été dépassé。Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de la liaison appropriée。---> System.ServiceModel.QuotaExceededException: Le quota de taille maximale autorisée pour les messages entrants (65536) a été dépassé。Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de la liaison appropriée。--- Fin de la trace de la Pile d'exception interne ---

服务器堆栈跟踪: à System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded() à System.ServiceModel.Channels.HttpInput.GetMessageBuffer() à System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream inputStream) à System.ServiceModel.Channels.HttpInput .ParseIncomingMessage(异常和 requestException)à System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)à System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan 超时)à System.ServiceModel.Dispatcher.RequestChannelBinder。 Request(Message message, TimeSpan timeout) à System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs,TimeSpan 超时)à System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)à System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

[0] 处重新抛出异常: à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 类型)à IWS_MG.ProceedOperation(字符串 xmlIn) à WS_MGClient.ProceedOperation(String xmlIn)}

这个异常意味着maxsize为65536,接收到的数据量更大。

有人知道如何更改 maxsize 吗?

有关信息,这是我的代码:

0 投票
1 回答
325 浏览

c# - 是否可以在没有基类或接口的情况下创建动态代理?

是否可以使用通用库创建动态代理,例如Castle Dynamic Proxy没有任何基类或接口?我确实有兴趣在运行时拥有动态的即时类。