C# 基于插件的应用程序,带有修改其他插件的插件

C# 基于插件的应用程序,带有修改其他插件的插件,c#,plugins,prism,mef,C#,Plugins,Prism,Mef,我正在研究如何在C#中构建模块化的、基于插件的应用程序。 我正在阅读有关Prism和MEF(我已经在我的一些项目中使用过) 我找到的所有示例和文章都是关于离散模块的。我的问题就是这个。假设其中一个模块不提供新的视图,但它“只是”需要通过添加一个或多个字段和一些进一步的逻辑来更改由不同模块提供的现有视图。你会怎么做 在合成时检查目录中存在哪些其他部分并以编程方式修改它们,这是一种好方法吗 如果“模块1”和“模块2”改变了“模块1”中的某些内容,我可以认为这是一个可能的解决方案。但如果情况变得更加复

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

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

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

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

你能就如何实现这一点给我一些建议吗

提前感谢,

干杯


Gianluca

您可以让主机应用程序通过“plugins”属性公开插件集合。然后你的插件可以在插件集合中迭代,直到你找到一个合适的类型,然后修改它


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

从您的示例中,我推断您有一些类似于此的导出,您可以在某个地方执行
[ImportMany]

[Export(typeof(IView))]
public class BarView : IView
{
    ...
}
假设一个特定的视图实现本身需要可插拔。然后你可以这样做:

[Export(typeof(IView))]
public class FooView : IView
{
    [ImportMany(IFooViewPlugin)]
    public IEnumerable<IFooViewPlugin> Plugins { get; set; }

    ...
}
[Export(typeof(IView))]
公共类FooView:IView
{
[导入名称(IFooViewPlugin)]
公共IEnumerable插件{get;set;}
...
}

当然,仍然由您决定
IFooViewPlugin
,并决定
FooView
如何调用它来自定义自身。这取决于您想要什么样的定制。

谢谢您的回复。那么,你认为有可能做到我的建议吗?这是实现目标的正确途径吗?