2

我正在开发一个需要通过插件模块支持自定义的系统。我正在针对接口进行编码,因此插件代码只需要实现这些接口即可插入系统。

// for illustration purposes; not actual code
public interface IPluggable
{
    void Setup(PluginConfig c);
    bool Process(IProcessable p);
}

我从配置中读取需要加载哪些插件,其中指定了程序集名称和完全限定的类型名称。

<plugin assembly="Foo.Bar.PluginAssembly" type="Foo.Bar.Plugins.AwesomePlugin" />

类型Foo.Bar.Plugins.AwesomePlugin实现IPluggable并包含在程序集中的位置Foo.Bar.PluginAssembly.dll。有了这些信息,我继续创建所需插件的实例。

IPluggable plugin = (IPluggable)Activator.CreateInstance(assemblyName, typeName).Unwrap();

所以我的问题有三个:

  1. 插件系统的推荐模式是什么?我采取的方法是否有意义,或者我是否遗漏了任何明显的缺陷/警告?
  2. 动态实例化插件对象是Activator.CreateInstance()一个不错的选择吗?
  3. 如何更具体地了解要加载的程序集及其位置?假设我只想从位于.\plugins子文件夹中的程序集中加载插件。
4

1 回答 1

4

按顺序回答您的问题:

  1. 我喜欢这样,当我需要编写插件组件时,我会使用这样的模式。其他人推荐使用各种框架——我知道MEF非常流行。但是我发现使用.NET 框架对我来说很容易,学习MEF 框架只是我需要学习和记住的另一件事。这可能值得一试,但取决于你。

  2. 我一直使用Assembly.CreateInstance,但差异可能不会影响您(Assembly.CreateInstance 和 Activator.CreateInstance 之间的差异?

  3. 您只需使用System.IO命名空间。该类DirectoryInfo有一个方法可以枚举与给定模式匹配的所有文件(大概是*.dll)。对于每个匹配项,我将使用System.Reflection命名空间来询问并找到任何实现您的接口的类型,然后CreateInstance.

就 MEF 而言,我的看法是:如果我要在多个系统或项目上使用大型、可管理且灵活的插件系统,那么我会对它非常感兴趣,并利用其他人的工作成果这样做是为了节省时间并避免常见的陷阱。

如果我正在编写一个非常简单的一次性插件系统,并且我知道如何使用 .NET 框架来完成此操作的基础知识,那么我会跳过学习 MEF 的开销并编写代码。我可以在不到一个小时的时间内编写一个合理的插件过程,但是在下载、引用、尝试配置 MEF 之后——我怀疑我有什么可以展示的。

于 2013-03-14T20:52:43.313 回答