我试图弄清楚何时使用DIC / IoC注册表来配置我的软件以及何时使用工厂,以及这两种方法背后的原因。
我正在使用StructureMap作为我的DI容器(DIC),使用注册表很容易配置它。在DIC中,从某种意义上说,实际上所有注册的对象都是静态的,一旦配置了DIC并且在DIC中将它们配置为单例,就不需要在运行时更改/交换任何实现/实例。但是,由于我的软件(SW)将在不同的设备上运行,因此我确实需要根据运行我的SW的设备选择特定于设备的注册表,以便相应地配置硬件。
由于某些对象的构造需要读取配置文件,因此我正在使用工厂将这些实例返回给DIC,以便将配置的读取与对象的创建分开。我在DIC中为相应的插件类型注册了工厂吸气剂。
现在说我有一个插件类型IMotor
与具体类型Motor1
和Motor2
,这应该由厂家来处理。现在,有两种方法可以决定如何配置设备:
- 我将有关运行SW的设备的信息传递给,
MotorFactory
并且它返回正确的电动机,Motor1
或者Motor2
。在这种情况下,决定的逻辑是在工厂内部。 - 我根据运行它,并创建两个工厂的设备配置DIC
Motor1Factory
和Motor2Factory
,其中一个创建Motor1
和其他Motor2
。在这种情况下,对于IMotor
使用Motor1Factory
或的设备特定的注册表,我会有不同的注册表项Motor2Factory
。
现在我的问题是:这两种方法中哪一种更可取,为什么?在我看来,第一种情况并非一帆风顺,而且令人费解,因为我在整个代码库中扩展了决定实例化哪种类型的逻辑。在第二种情况下,由于我将需要(几乎)每种具体类型的工厂,因此我实际上在代码中增加了工厂的数量。当将抽象工厂添加到组合中时,这让我更加困惑。
再说一遍:什么时候应该使用一种方法?更重要的是:什么是决定走哪条路的好指标?