2011-03-31 34 views
2

我有一个模块化的应用程序,它的行为很像一个插件系统。模块B依赖于模块A.当B存在时,模块A中需要更改一些对话(标题等)。另外,当模块B存在时,我应该使用不同的实体作为列表包含在模块B中,所以A在编译期间不知道它。在A中为实体创建一个抽象基础也是我想要避免的。面向组件的设计:与对话框中的依赖关系的问题

您将如何实施此要求?这些模块可以以不同的方式沟通:

1.) Microsoft Unity is used for Object creation and dependency injection 
2.) The modules can communicate via a Message-System. 
3.) There's an EventAggregator which all the modules can use 

我不想sublcass在模块B的对话,只是改变团结typemapping,因为那时我不得不提供另一模块整个对话框。另外,如果某个其他模块想要对对话框进行其他更改,则不可能。

建议欢迎!

回答

1

不知道具体细节,我会使用接口来混合插件组件/模块。要求每个插件组件都实现一个接口 - 比如IPluginComponent或其他任何有意义的东西。 (实际上,只有必须通信或交互的组件实际上需要才能实现该接口。)一旦加载了所有模块,主机应用程序就可以触发组件上的方法或事件。

就我个人而言,我喜欢保持东西数据驱动和尽可能简单;所以我可能会倾向于通过模块进行“两阶段”传递。这使得模块之间的依赖性变得简单。因此,在第一阶段,当加载所有组件时,主机应用程序触发“ContributeSharedData(Context ctx)”方法,其中每个组件在共享上下文中设置任何值。 (这也可以被称为“初始(ctx)”。)上下文可以与名称 - 值对集合一样简单,例如,模块B说* coll [“ModuleB_Installed”] = true *,或者它可以将自己添加到模块列表中,或者......可能性是无止境的。上下文可以是使这些组件一起工作所需的任何类或结构。

下一步 - 如果需要的话 - 将根据共享的上下文为零件/模块配置自己。因此,主机可能会运行支持共享接口的所有模块,并触发“配置”方法或事件。然后ModuleA可以查看上下文并查看ModuleB已安装,并相应地配置其接口。

如果一个接口对您的情况没有意义,您可以使用任何以普通方式向共同位置提供共享数据的方法,例如,消息或其他常用类。

希望这会有所帮助!

+0

我非常喜欢SharedContex的想法!它似乎是可扩展的。 – Falcon 2011-03-31 17:30:45