【问题标题】:Should the Managed Extensibility Framework be used to consume external plugins?是否应该使用托管可扩展性框架来使用外部插件?
【发布时间】:2010-09-30 08:00:18
【问题描述】:

我想我得到了 MEF 模型。但我很难确定它是否适合我正在尝试做的事情。

我有一个应用程序,它会调用第三方插件来进行一些视频处理。插件可以是FFMPEG.exe或者x264.exe,没关系。调用插件的过程是通过 ProcessStartInfo(基本上是通过命令行)并传递一堆参数。例如

ffmpeg.exe -in "c:\vid.avi"  -out "c:\vid.avi" -Xheight 100 -Xwidth 100
or 
x264.exe -in "c:\vid.avi"  -out "c:\vid.avi" -Yheight 100 -Ywidth 100

假设每个插件都有自己的参数集,那么使用 MEF 是否合适,所以无论使用哪个插件,接口都是相同的(通过公共合同进行 alebit)?如果是这样,我必须为每个实现合同的插件编写一个包装类吗?

这是使用 MEF 的正确方法吗?一方面,我试图通过允许客户选择他们的插件来使我的应用程序可扩展。但我真的不确定 MEF 是否是矫枉过正,而简单地使用配置文件来存储命令是一种更好的方法?

【问题讨论】:

    标签: c# design-patterns plugins mef


    【解决方案1】:

    如果您可以简单地使用配置文件,那么这将是更可取的。它将允许在不重新编译的情况下添加或更改插件。这也将为高级用户提供调整插件的机会。

    【讨论】:

    • @Tim:我的意思不是重新编译核心,而是在插件模块发生变化的情况下重新编译或在添加插件的情况下进行编译。
    • 是的,如果您更改了任何代码,则必须重新编译。您不必重新编译即可添加插件。这就是插件的意义所在!
    • 可以,但是你需要编译插件,在我们的例子中你不需要编译任何东西,所以即使是用户也可以创建插件(但这并不总是好的)。
    【解决方案2】:

    MEF 是向应用程序添加可扩展性的好方法。您只需要在应用程序中定义一个接口,在外部组件中实现该接口,然后在实现中添加一个 Export 属性。在您的应用程序中使用 Import Attribute,您可以发现外部组件。有关详细信息,请参阅the documentation。如果您阅读本文,您将在不到 2 小时内使用 MEF 运行应用程序。

    回到主题:如果您只是用不同的参数调用不同的应用程序,我不会选择 MEF,因为它有点矫枉过正。但是,使用 MEF 很有趣,如果您想进行一些实验,您仍然可以将它用于您的应用程序,只是为了获得学习体验。

    【讨论】:

      【解决方案3】:

      听起来 MEF 对于您想要的东西可能有点过头了。您的插件已经是外部应用程序,并且您已经可以调用它们。编写包装器似乎需要更多的工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        相关资源
        最近更新 更多