【发布时间】:2011-08-30 00:38:57
【问题描述】:
我有一个架构问题。我有一个概念上是这样的项目:
这看起来很简单,但有一些皱纹。一些背景,通过一个部分虚构的例子。这是一个ASCOM driver,它控制一些电机、传感器和一些电源开关。硬件设备可以旋转天文台并报告其位置,打开和关闭快门以及打开和关闭各种观测仪器(望远镜、照相机、调焦器等)的电源。
硬件抽象层处理通过串行链路发送和接收命令以及随之而来的任何时序和排序问题。表示层可以调用 HAL 中的方法来使硬件执行某些操作,这可能会在串行端口上生成一系列命令和响应,或者根本不生成。未经请求的数据也可以到达串口,完全在 HAL 内处理。
“表示层”由几个 COM 接口组成。一个接口 (IDome) 处理控制圆顶和快门,另一个接口 (IPower) 处理各种设备的电源控制。这是一个标准,不能更改。
当两个不同的程序想要访问该设备时,问题就出现了。例如,一个程序可能想要通过 IDome 接口控制球机,另一个程序可能想要使用 IPower 接口控制电源。在当前的实现中,这会导致整个程序集的两个实例在不同的进程中创建,一个因串行端口争用而失败,只能允许一个连接。
我需要找到一种将 HAL 和表示层解耦的方法,使得 COM 接口可以被多个进程加载,而 HAL 只加载一次并服务于表示层的所有实例。
目前所有这些“层”都包含在一个 .NET 程序集中,如果可能的话,我更愿意保持这种方式。
什么模式适合这种情况?非常感谢任何和所有建议。
【问题讨论】:
-
嗯,那么当两个程序都想使用 IDome 时会发生什么?这往往很快就会以与 SerialPort 处理它的方式完全相同的方式结束:先到先得,对其他所有人拒绝访问。
-
它并没有那么糟糕,因为 HAL 实际上主要处理缓存数据,因此实际上不存在资源争用。唯一的争论点实际上来自 HAL 必须打开串行端口这一事实。此外,在这种特殊情况下,多个程序访问同一个界面是不正常的,多个程序将各自访问不同的界面。其中一些架构已有 10 多年的历史,并且早于 .NET,所以它有点尴尬。
-
一个程序使用 IDome 对月球进行成像,另一个使用它对火星进行成像。应该怎么会有好的结局?有资源争夺,只有一个穹顶。
-
如果你有一个集中的进程来控制它,请求不仅可以指定目标(火星),还可以指定源。如果该位置不再是源,您可以提供一个很好的错误。这样,有人可以请求拍摄火星的图像,但前提是该客户和用户明确将其从月球上移开。
标签: .net design-patterns architecture ipc interprocess