我有一个带有返回类型(foo)的函数的网络服务。如果我通过 2.0 生成的代理在 .NET 中使用此 Web 服务,它会在生成的代理中创建一个名为 foo 的类。如果我有包含该类 (foo) 的 DLL,该类是 web 服务正在使用的 DLL,有没有办法让它使用该类而不是创建自定义代理类?我正在寻找类似于远程处理的东西......但不是远程处理。
3 回答
我认为这里的关键问题是生成代理。我通常对 Web 服务使用两种不同的方法:
1) 传统服务,您公开方法,客户端在 Visual Studio 中生成代理以使用这些方法。
2) 请求/响应服务,其中暴露的“服务”更多是一种传递,并且正在执行的“动作”被封装在发送到服务和从服务接收的对象中。这些操作将在服务器和客户端都拥有的共享库中。
在前者中,我经常遇到同样的问题,我真的不认为有解决方案,至少 Visual Studio 根本不会喜欢的解决方案。您也许可以手动修改生成的代理以使用其他类,但是您必须在重新生成时重复该步骤。相反,您可以在 Visual Studio 之外生成类似CodeSmith的东西(旧版本是免费的,但取决于 .NET 1.1),这将需要一些工作来为代理创建模板并在 IDE 之外重新生成任何时候你需要更新它们。
不过,我可以为后者推荐一个好的工具,那就是Agatha项目。它采用将“服务”与正在执行的“动作”分离的方法,使共享库的方法非常容易。根据您的日程安排,对于您正在从事的项目来说,这样的重新架构很可能是不可能的,但这绝对是未来项目需要探索的东西。
您可以编写自己的代理类,或者您可以在您的 Foo 类上实现一个构造函数,该构造函数采用生成的 Foo 类的实例并根据需要复制数据。
我已经看到了 3 种方法:
- 让 Visual Studio 生成代理,然后手动将代理中的类更改为 dll 的完整类名。可以,但是每次更新代理时都必须再次执行此操作。而且它真的很脏,不是吗?
- 使用通用类/方法,通过反射将代理对象的深层副本创建到“真实”对象中。工作,但当然有一点表现offtrade
- 使用 WCF,您可以在其中使用数据协定(您的数据类)引用 dll 并使用它们,而不是通过代码生成创建任何代理。