我有以下两个接口:
interface IModule
{
IModuleResult Invoke(InstallerContext context, IModuleConfiguration config);
}
interface IModuleConfiguration
{
}
IModuleConfiguration
用于配置每个模块。它在XML文件中加载/存储配置设置,并通过Web应用程序进行配置。
流程是:
亚军 - >从单个XML文件加载配置 - >从另一个XML文件加载运行器指令 - >调用所选模块
设计有效,但每个模块只能使用自己的配置。它破坏了LSP,我想知道是否有更好的方法来设计它。
使用interface IModule<T> where T : IModuleConfiguration
不会破坏LSP,但是很难处理每个模块(因为我需要将它们作为object
存储在List
中并使用反射来调用它们)。
答案 0 :(得分:0)
我不太清楚这些类型的实例是如何形成的,以及它们应该在多大程度上可以互换。在某些情况下可能有用的一种方法是使用代理。例如,假设某种类型的对象应该提供一种方法来保存其状态并在以后恢复它。如果状态应该恢复到保存它的同一个对象,则“保存上下文”例程可以返回一个委托,该委托在执行时将恢复该对象的状态。代理可以包含任何类型的数据,但所有代码都是类型安全的。
其他选项是使IModuleConfiguration对其配置的模块类型具有通用性,并让IModuleConfiguration包含一个ConfigureModule或InvokeModule方法(它将自己传递给模块的Configure或Invoke方法),或者有一个IConfiguredModule接口,其调用方法不会对配置有任何说明(类的实例应该将模块与适当的配置组合在一起)。
哪种方法最合适取决于如何创建和使用各种实例。