我正在研究如何在C#中构建基于插件的模块化应用程序。 我正在阅读Prism和MEF(我已经在我的一些项目中使用过)。
我发现的所有示例和文章都谈到了离散模块。我的问题就是这个问题。假设其中一个模块没有提供新视图,但它“简单地”需要通过添加一个或多个字段和一些其他逻辑来改变由不同模块提供的现有视图。你会怎么做?
检查目录中存在的其他部分以及以编程方式修改它们的构图时间是否是一种好方法?
如果有“模块1”和“模块2”改变“模块1”中的内容,我可以将其视为一种可能的解决方案。但如果情景变得更复杂?例如,如果我们有一个必须由“模块2”和“模块3”修改的基本“模块1”,而且它还存在一个“模块4”,它修改了“模块2”提供的UI和逻辑,并且那么......?
你能告诉我如何实现这个目标吗?
提前致谢,
干杯,
詹卢卡
答案 0 :(得分:1)
从您的示例中我推断出您的导出看起来有点像这样,您可以在某处执行[ImportMany]
:
[Export(typeof(IView))]
public class BarView : IView
{
...
}
假设一个特定的视图实现本身需要可插拔。然后你可以做这样的事情:
[Export(typeof(IView))]
public class FooView : IView
{
[ImportMany(IFooViewPlugin)]
public IEnumerable<IFooViewPlugin> Plugins { get; set; }
...
}
当然,您仍然需要塑造IFooViewPlugin
并决定FooView
如何调用它来自定义。这取决于您的想法。
答案 1 :(得分:0)
您可以让主机应用程序通过“插件”属性公开插件集合。然后你的插件可以迭代插件集合,直到你找到一个正确的类型,然后修改它。
为了安全起见,您可能希望在要修改的插件中添加一些测试代码(例如设置密码)以防止不需要的插件进行修改。