如何处理相同数据的多种对象类型
How to handle a wide variety of object types for the same data
我正在构建一个使用大量矢量的应用程序,并且为此我使用了大量第三方和系统程序集。结果是我有四种方法来表示 3d 双精度向量,还有五种方法来表示这些向量的集合。我拥有的几乎所有东西都是如此。结果是我需要为大约三种不同的实际结构处理 30 种不同的类型。根据您的经验,处理此问题的最简洁方法是什么?
如果其他系统正在向您的应用程序提供矢量数据,并且传输只是 one-way(进入您的应用程序),那么您所要做的就是决定如何在其中存储/处理矢量您的应用程序,当数据进来时,只需将其转换为该格式即可。转换是一件 one-time 的事情,一旦转换完成,您只需担心一种格式。
(相同的架构可以处理 two-way 交互 - 让我最后讲一下)。
这就是依赖倒置派上用场的地方,因为您可以编写不同的模块,每个模块专用于特定的第 3 方系统,并在运行时加载适当的模块。
图表/架构解释:
- 外部矢量服务 - sub-system 或处理来自第 3 方系统的传入数据的层。
- 服务逻辑 - 处理/协调外部向量服务功能的代码。
- IExternalVectorProvider 描述您需要支持的操作的接口,例如“SaveFunkyVectors”、“SaveDoubleProjectionVector”。
- SystemA_VectorProvider、SystemB_VectorProvider 和 SystemC_VectorProvider - 实施 IExternalVectorProvider 的第 3 方特定 类。
- 依赖注入Sub-System - 在运行时,将正确的 IExternalVectorProvider 实现加载到服务逻辑中。
例如:
- 您的应用确定它正在与第 3 方系统 A 对话,并将正确的模块 (SystemA_VectorProvider) 加载到服务逻辑中。
- 这允许您的应用程序使用系统 A 理解的矢量格式与第 3 方系统 A 交互。
- 一旦 SystemA_VectorProvider 有了数据,它就会将其转换为您的标准格式,并将其传回服务逻辑,然后传递到您应用程序的任何其他部分。
我将依赖项注入放在应用程序的主要部分,因为理想情况下它将是通用的,您可以在其他地方重用它。
那Bi-Directional呢?
可以使用完全相同的架构 - 只要您的 IExternalVectorProvider set-up 可以 re-format 从您的标准返回目标第 3 方的数据。
我正在构建一个使用大量矢量的应用程序,并且为此我使用了大量第三方和系统程序集。结果是我有四种方法来表示 3d 双精度向量,还有五种方法来表示这些向量的集合。我拥有的几乎所有东西都是如此。结果是我需要为大约三种不同的实际结构处理 30 种不同的类型。根据您的经验,处理此问题的最简洁方法是什么?
如果其他系统正在向您的应用程序提供矢量数据,并且传输只是 one-way(进入您的应用程序),那么您所要做的就是决定如何在其中存储/处理矢量您的应用程序,当数据进来时,只需将其转换为该格式即可。转换是一件 one-time 的事情,一旦转换完成,您只需担心一种格式。
(相同的架构可以处理 two-way 交互 - 让我最后讲一下)。
这就是依赖倒置派上用场的地方,因为您可以编写不同的模块,每个模块专用于特定的第 3 方系统,并在运行时加载适当的模块。
图表/架构解释:
- 外部矢量服务 - sub-system 或处理来自第 3 方系统的传入数据的层。
- 服务逻辑 - 处理/协调外部向量服务功能的代码。
- IExternalVectorProvider 描述您需要支持的操作的接口,例如“SaveFunkyVectors”、“SaveDoubleProjectionVector”。
- SystemA_VectorProvider、SystemB_VectorProvider 和 SystemC_VectorProvider - 实施 IExternalVectorProvider 的第 3 方特定 类。
- 依赖注入Sub-System - 在运行时,将正确的 IExternalVectorProvider 实现加载到服务逻辑中。
例如:
- 您的应用确定它正在与第 3 方系统 A 对话,并将正确的模块 (SystemA_VectorProvider) 加载到服务逻辑中。
- 这允许您的应用程序使用系统 A 理解的矢量格式与第 3 方系统 A 交互。
- 一旦 SystemA_VectorProvider 有了数据,它就会将其转换为您的标准格式,并将其传回服务逻辑,然后传递到您应用程序的任何其他部分。
我将依赖项注入放在应用程序的主要部分,因为理想情况下它将是通用的,您可以在其他地方重用它。
那Bi-Directional呢?
可以使用完全相同的架构 - 只要您的 IExternalVectorProvider set-up 可以 re-format 从您的标准返回目标第 3 方的数据。