在 .NET 中使用 SOAP WS 时使用自动生成的 classes/objects?
Use auto-generated classes/objects when using a SOAP WS in .NET?
在当前项目中,我必须开发一个 .NET 客户端应用程序,它使用少量 SOAP Web 服务与外部软件通信。
幸运的是,.NET 使使用 SOAP WS 变得非常容易,因为它在添加服务引用时会生成所有必需的对象。
另一方面,在使用这个自动生成的 类 一段时间后,我不确定是直接在业务逻辑中使用它们更好还是应该 map他们进入我自己的模型(例如使用类似存储库模式的东西)。
制图优点:
- 业务逻辑和数据访问的分离(WS 可能会改变)
- 调用 WS 的中心点(可以验证响应并进行适当的错误处理)
- 有时 WS 类型使用起来很麻烦(例如 WebService1.TypeA 与 WebService2.TypeA 不兼容)。
- 已生成 类 cannot/should 无法自定义。
- ...
映射的缺点:
一些使用的 WSDL 具有复杂的结构和大量的嵌套类型。如果将它们映射到我自己的模型,我必须复制许多 类 和属性。这就是我对这个解决方案感到担忧的原因。
简而言之 我不确定将 Web 服务 类 复制到我自己的名称空间以及存储库或外观模式的实现是否是正确的方法去或只是炸毁建筑。
是否有任何最佳做法或类似做法?
根据我 20 多年的经验,如果项目的生命周期不确定或可能很短,添加 repository/service 层可能会过大。还有一个额外的性能问题,但是如果正确完成,SOAP 本身将比对象映射层更成为瓶颈。此外,裸对象应用程序不会从关注点分离中受益。
话虽这么说,如果您现在连接到 SOAP 端点,您很可能正在开发一个企业应用程序,该应用程序应该被构建为存在几年并随着时间的推移得到增强。也就是说,旨在满足不断增长的需求。因此,就您的优缺点而言,根据我的经验,这取决于 return 时间投入。从您在此处发布的信息来看,额外的努力将是有益的。
如果做得好,生成可以成为一个很好的工具。为了类似的目的,我在我的项目中做了相当多的 T4 生成。就最佳实践而言,我将 classes 生成到“生成的”子命名空间中并扩展它们。这样我就可以扩展功能和结构而不用担心它们被覆盖。在生成的 classes 中,我将所有内容标记为部分和虚拟,以便我可以在继承之外进行选择。一次完成所有操作可能有点矫枉过正,但值得考虑。利用部分 classes 可能是修改和扩展生成的 classes 的另一种方法。
您甚至可以生成 extended/partial classes。我使用 T4Toolbox 生成外部文件并使用“PreserveExistingFile”来防止文件被覆盖。 T4Toolbox(如果您还没有使用它)提供了一种很好的模块化方式来管理您的生成,甚至可以生成到其他项目中。
即使您不添加存储库层,我也鼓励您应用 Composite 和 Façade 模式的概念来简化与外部服务的交互。
综上所述,根据我的经验,最佳做法:
存储库:
- 如果您需要 long-lived 并且可扩展
世代:
- 使用 命名空间 和 class 命名,明确表示 class 已生成并将被覆盖。
- 创建class部分 es 或扩展生成的 classes 以获得灵活性
T4Toolbox 如果使用 T4
- 模块化 T4
- 保留自定义代码
在当前项目中,我必须开发一个 .NET 客户端应用程序,它使用少量 SOAP Web 服务与外部软件通信。
幸运的是,.NET 使使用 SOAP WS 变得非常容易,因为它在添加服务引用时会生成所有必需的对象。
另一方面,在使用这个自动生成的 类 一段时间后,我不确定是直接在业务逻辑中使用它们更好还是应该 map他们进入我自己的模型(例如使用类似存储库模式的东西)。
制图优点:
- 业务逻辑和数据访问的分离(WS 可能会改变)
- 调用 WS 的中心点(可以验证响应并进行适当的错误处理)
- 有时 WS 类型使用起来很麻烦(例如 WebService1.TypeA 与 WebService2.TypeA 不兼容)。
- 已生成 类 cannot/should 无法自定义。
- ...
映射的缺点:
一些使用的 WSDL 具有复杂的结构和大量的嵌套类型。如果将它们映射到我自己的模型,我必须复制许多 类 和属性。这就是我对这个解决方案感到担忧的原因。
简而言之 我不确定将 Web 服务 类 复制到我自己的名称空间以及存储库或外观模式的实现是否是正确的方法去或只是炸毁建筑。
是否有任何最佳做法或类似做法?
根据我 20 多年的经验,如果项目的生命周期不确定或可能很短,添加 repository/service 层可能会过大。还有一个额外的性能问题,但是如果正确完成,SOAP 本身将比对象映射层更成为瓶颈。此外,裸对象应用程序不会从关注点分离中受益。
话虽这么说,如果您现在连接到 SOAP 端点,您很可能正在开发一个企业应用程序,该应用程序应该被构建为存在几年并随着时间的推移得到增强。也就是说,旨在满足不断增长的需求。因此,就您的优缺点而言,根据我的经验,这取决于 return 时间投入。从您在此处发布的信息来看,额外的努力将是有益的。
如果做得好,生成可以成为一个很好的工具。为了类似的目的,我在我的项目中做了相当多的 T4 生成。就最佳实践而言,我将 classes 生成到“生成的”子命名空间中并扩展它们。这样我就可以扩展功能和结构而不用担心它们被覆盖。在生成的 classes 中,我将所有内容标记为部分和虚拟,以便我可以在继承之外进行选择。一次完成所有操作可能有点矫枉过正,但值得考虑。利用部分 classes 可能是修改和扩展生成的 classes 的另一种方法。
您甚至可以生成 extended/partial classes。我使用 T4Toolbox 生成外部文件并使用“PreserveExistingFile”来防止文件被覆盖。 T4Toolbox(如果您还没有使用它)提供了一种很好的模块化方式来管理您的生成,甚至可以生成到其他项目中。
即使您不添加存储库层,我也鼓励您应用 Composite 和 Façade 模式的概念来简化与外部服务的交互。
综上所述,根据我的经验,最佳做法:
存储库:
- 如果您需要 long-lived 并且可扩展
世代:
- 使用 命名空间 和 class 命名,明确表示 class 已生成并将被覆盖。
- 创建class部分 es 或扩展生成的 classes 以获得灵活性
T4Toolbox 如果使用 T4
- 模块化 T4
- 保留自定义代码