我正在开发与科学仪器交互的.Net桌面应用程序。这个工具有很多种不同的形式,每种都有不同的特性,组件等,所以我想出了一个插件/模块化架构,其中“模块组件”包含所有必要的业务逻辑,用户界面等与该硬件组件/功能进行交互。模块化应用程序体系结构和Castle Windsor
目前我有一个解决方案,包含所有内容 - “核心”应用程序项目,公共库和“模块”项目。我们的想法是,我们将整批安装到客户站点(而不是挑选他们需要的DLL),并使用包含所需模块列表的配置文件“激活”相关模块。
主应用程序项目使用CastleFindsor使用AssemblyFilter和自定义InstallerFactory加载模块。它搜索每个模块组件,查找实现IWindsorInstaller
和的装饰有特定自定义属性(具有包含模块名称的属性)的类。只有当属性的模块名称是请求的模块名称时,模块的安装程序才会运行。这些安装程序类负责使用Windsor(业务逻辑,视图,视图模型等)注册该模块所需的所有内容。
该解决方案在我的概念证明中工作正常,但是我可以看到两个或更多个模块在功能上非常相似的情况,因此需要共享通用代码。假设我有项目“ModuleA”和“ModuleB”,他们的Windsor安装人员在项目“ClassLibraryX”中注册了相同的IFooService
类。该应用程序将会崩溃,因为IFooService已被重新编写了两次,而Windsor在构造函数请求时不会知道要解析哪一个。
处理这个问题的最佳方法是什么?到目前为止的想法: -
- 找出一个特定的组件是否已经在Windsor注册过。这感觉hacky(如果可能的话)
- 使用名称注册组件,但我如何请求具有构造函数注入的命名实例?
- 在每个模块项目中创建一个新界面,如
public interface IModuleAFooService : IFooService
,并在整个项目中注册/使用此界面(而不是IFooService
)。
有什么想法?
编辑:事实上,当Windsor尝试分辨IFooService
时,它不会倒下。当第二个模块尝试注册相同的接口/具体实现时,它会崩溃!
我也想过在“共享”程序集中安装一个安装程序,但我想这意味着要注册这些共享组件,而不管是否有任何相关模块已被“激活”。也许我只是从一座痣山上爬出一座山,而不必要的注册(这在启动时发生)的开销很小。 –
是的,我认为可用组件的注册几乎没有开销。我会这样想:您正在激活可以使用的核心组件,但是每个模块都会在执行之前确保它处于活动状态。 –