问题标签 [proxy-classes]

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 投票
2 回答
167 浏览

design-patterns - 向世界其他地方隐藏一些仅供内部类使用的方法

简短的问题

我有一个C++域模型。它有一些内部 API 使用的方法以及其他公共方法我不想公开那些 API 方法。我正在考虑使用代理模式来隐藏这些方法。你认为这是个好主意吗?是否有一些设计模式可以实现这一目标?

长示例

假设在某个远程位置有一个机械臂,它可以由软件控制,但也可以由一些技术人员手动移动。它有一些传感器,可以让它知道它拿着哪种物体。在我的项目中,情况完全不同,但我只是以此为例。所以我有一个包含RoboticHeldObject抽象类的 RoboticArm 类RoboticArm让您知道它持有哪个RoboticHeldObject,除了让您移动手臂。但是,您不能决定拾取和释放对象。这是由操作机器人的技术人员决定的。所以它会是这样的:

由于实现相当复杂,我使用了一个外部类,RobotService,它实际上执行了艰苦的工作。但是,它不是贫血域模型,因为它是RoboticArm实际使用RobotService(因此具有功能),而世界其他地方对RobotService 一无所知

这里的问题是: releaseObject ()holdObject()是此处仅由RobotService使用的 API 方法。仅当技术人员释放手臂握住的物体或放置新物体时, RobotService才会调用它们。因此,当RobotService处理某些网络事件时调用它们(请记住,手臂位于远程位置,因此事件是通过网络接收的)。例如:

我的方法

要隐藏这些方法,我会将 RoboticArm 重命名RealRoboticArm创建一个RoboticArm代理类:

由于RoboticArm是一个代理,RoboticArm::heldObject() 将调用 realArm->heldObject()、RoboticArm::moveUp() realArm->moveUp() 等等。

RobotService将有一个指向RealRoboticArm实例的指针,因此它可以调用 API 方法,例如 releaseObject() 但是,应用程序的其他部分只能使用RoboticArm中的方法,因为它们没有指向RealRoboticArm的指针。因此releaseObject ()holdObject()将对观众有效地隐藏起来。

问题

我不是 100% 确定这是代理模式还是适配器模式。你认为这是为这样一个系统建模的正确方法吗?有更好的模式吗?

0 投票
1 回答
9196 浏览

c# - Web Service代理类实现接口

我正在寻找一种方法让为 Web 引用(不是 WCF)生成的代理类实现一个通用接口,以便在客户端应用程序中轻松地在 Web 服务访问和“直接”访问我们的业务层之间切换,例如:

CustomSerializableType但是,生成的代理类中没有引用自定义类型(例如下面的示例中的)。相反,会生成新的相同类型,这使得代理类无法实现接口。

有什么方法可以让生成的代理类引用这些类型,还是我做错了?我是否应该考虑将 Web 服务转换为 WCF 服务?


细节

我们的解决方案包括以下四个项目:

  • 业务库(包含业务逻辑,访问数据存储)
  • 一个通用库(包含通用功能,包括CustomSerializableType
  • Web 服务(充当远程客户端和业务层之间的代理)
  • 一个窗口应用程序

我们的客户希望 Windows 应用程序能够以两种不同的模式运行:

  • 本地模式,应用程序直接使用业务库来访问数据
  • 远程模式,应用程序与 Web 服务通信以访问数据

为此,我们创建了一个接口 IBusiness,它位于公共库中,包含所有业务方法。

界面

业务层

网络服务

生成的代理类(为了便于阅读,省略了大量代码)

0 投票
1 回答
1366 浏览

ruby-on-rails - 具有 ActiveRecord 模型的代理对象 - method_missing 有时不起作用

我一直在使用我的应用程序模型作为定义行为的其他对象的代理。

所以我在我的 BoxBehavior 对象上实现了所有方法,当我在一个盒子实例上调用一个方法时,它会将调用重定向到关联的 boxbehavior 对象。一切正常,除非我尝试在我的购买模型上创建一个钩子,它从它的盒子对象中获取总数并保存它:

当我尝试保存任何关联了盒子的购买对象时,我收到此错误:

而且我不知道下一步该做什么......当我直接在盒子类中实现总方法时,它工作正常......我能做些什么来解决这个问题?代理工作不正常吗?

0 投票
1 回答
244 浏览

visual-studio - 重用 WebService,但使用自定义端点

我正在使用一个具有端点的Web 服务http://api.domain_a.com/,并且使用Visual Studio我可以轻松地生成一个代理类来轻松简单地使用该服务。

替代文字

但是我想创建一种用户可以使用他们自己的服务(并访问他们自己的数据,而不是我自己的数据)的方式,并且我想知道是否有一种方法可以即时更改服务的基本 URL .

举个例子

我通过将 Web 引用添加到我的项目来生成代理类,但是现在,每个请求我都有一个用户名,我将获得用户设置(女巫包含他们的 URL),我怎么能(如果可能的话)告诉生成的代理是我使用域http://domain_b.com/api而不是添加 Web 引用时使用的原始代理?

我需要手动调用服务吗?发送和接收 XML 数据?或者有一个“开关”可以用来指向新的 URL?

0 投票
1 回答
372 浏览

c# - WCF 代理类的派生接口

问题:

我有两个(或更多)非常相似的类:一个类的属性是另一个类的属性的子集。更具体地说,属性名称和语义是相等的,但不一定是它们的类型。但是,如果具有相同名称的属性的类型不同,则这些类型再次非常相似(在相同的意义上)。

我想为所有相似类集派生公共接口,以便我可以以相同的方式使用不同类的实例。

由于我的类有 100 多个属性,如果有可能,我想避免手动创建接口。

接口应该包含所有相似类的所有属性集的联合。(当读取特定对象不存在的属性时,null应该返回。当设置了这样的未定义属性时,什么都不应该发生。)所以我猜接口不再合适,而是包装器类或不同的东西......

语境:

我正在使用 WCF 来使用 Web 服务 ( CreateSalesOrder )。服务的输入消息需要 XML 模式类型Request_SalesOrder的元素,该元素由其他 XSD 类型(如Request_ItemRequest_ShipToLocation等)的子元素组成。

输出消息携带模式类型 Response_SalesOrder 的元素,该元素具有模式类型Response_ItemResponse_ShipToLocation等的相似子元素以及一些附加元素,例如类型Response_PriceTotal的元素PriceTotal

我想使用 ASP.Net MVC 构建一个使用 Web 服务的 UI。因此,我有一个视图呈现用于创建销售订单的表单。提交 Web 服务请求后,表单字段必须使用来自 Web 服务响应消息的值进行更新。

表单字段绑定到访问代理类属性的视图模型。提交表单时,视图模型必须更新代理类 A 的实例,而如果表单使用响应消息中的值呈现,视图模型将从代理类 B 的实例中读取。

0 投票
1 回答
342 浏览

java - 通过 RMI 调用接收代理作为参数时如何获取真实对象?

我有一个使用 RMI 进行通信的服务器和一个客户端,并且我有几个实现远程接口的类。

客户端接收代理没有问题,但是当我发送这个代理对象之一作为另一个 RMI 方法调用的参数时,服务器上的方法接收到代理的引用而不是“真实对象”的引用,它驻留在在同一个JVM中。

是否可以在服务器中接收真实对象实例作为参数(也就是说,通过让 JVM 自动处理转换)?接收本地对象的代理对我来说没有多大意义。

提前致谢!

0 投票
1 回答
1017 浏览

groovy - 在groovy中使用私有构造函数将闭包映射转换为对象

我正在使用 groovy 为测试用例创建一些模拟类。我基本上是在创建所有方法都返回 null 的虚拟对象,以便我可以运行我的测试用例。

我正在使用以下语法:

所以在这里我试图用我的假工厂对象覆盖单例实例。问题是 MessageFactory 的构造函数恰好是一个私有方法。当我运行上面的代码时,这给了我一个非法访问异常。有没有我可以在 groovy 中创建代理并克服私有构造函数问题的方法?

0 投票
3 回答
11819 浏览

java - 如何从动态代理中解开原始对象

展开动态代理以检索下面的原始对象的最佳方法是什么?已使用创建动态代理java.lang.reflect.Proxy.newProxyInstance()

谢谢你。

0 投票
1 回答
1431 浏览

c# - `RealProxy.GetTransparentProxy()` 在什么情况下会返回 `null`?

http://msdn.microsoft.com/en-us/library/system.runtime.remoting.proxies.realproxy.gettransparentproxy%28v=VS.100%29.aspx上的文档并未指出GetTransparentProxy将返回的场景null,但是null当我打电话给我时,我得到了回报。

什么情况下会导致这种行为?

0 投票
4 回答
52563 浏览

c# - 首先关闭 EF 代码的 CTP5 的 ProxyCreationEnabled 有什么缺点

我的 WCF 服务可以从代码优先模型返回类的唯一方法是将 设置ProxyCreationEnablefalse使用下面的代码。

这样做的负面后果是什么?一个好处是我至少可以将这些动态类型序列化,以便可以使用 WCF 通过网络发送它们。