【问题标题】:plugin-based applications with plugins that modify other plugins带有修改其他插件的插件的基于插件的应用程序
【发布时间】:2011-02-19 10:30:52
【问题描述】:

我正在研究如何在 C# 中构建基于插件的模块化应用程序。 我正在阅读 Prism 和 MEF(我已经在我的一些项目中使用过)。

我发现的所有示例和文章都在谈论离散模块。我的问题就是这个。假设其中一个模块不提供新视图,但它“简单地”需要通过添加一个或多个字段和一些进一步的逻辑来更改由不同模块提供的现有视图。你会怎么做?

在合成时检查目录中存在哪些其他部分并以编程方式修改它们是否是一种好方法?

如果有一个“模块 1”和一个“模块 2”改变了“模块 1”中的某些内容,我可以认为这是一个可能的解决方案。但是,如果情况变得更加复杂呢?例如,如果我们有一个基本的“模块 1”必须由“模块 2”和“模块 3”修改,但它也存在一个“模块 4”,它修改了“模块 2”提供的 UI 和逻辑,并且等等……?

您能告诉我如何实现这一点吗?

提前致谢,

干杯,

詹卢卡

【问题讨论】:

    标签: c# plugins prism mef


    【解决方案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 如何调用它来定制自己仍然取决于您。这取决于您考虑的自定义类型。

    【讨论】:

      【解决方案2】:

      您可以让宿主应用程序通过“插件”属性公开插件集合。然后,您的插件可以遍历 plugins 集合,直到您找到正确的类型之一,然后对其进行修改。

      为了安全起见,您可能希望在正在修改的插件中添加一些测试代码(比如设置密码),以防止被不需要的插件修改。

      【讨论】:

      • 感谢您的回复。那么,您认为可以按照我的建议进行操作吗?这是实现目标的正确方法吗?
      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2011-05-29
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多