应该为分布式应用程序中的插件动态加载定制MEF的哪些部分

时间:2012-08-14 11:40:36

标签: c# wpf mef

我的模拟应用程序将使用插件为模拟数据的存储提供模拟算法和数据结构。该应用程序由两部分组成。首先是提供UI的主机应用程序(作为WPF UI或作为CAD应用程序的插件)。此应用程序处理与用户的所有交互,但不执行任何模拟计算,也不存储任何模拟数据。第二部分是执行模拟计算的数据应用程序。数据应用程序没有任何方式让用户直接与它进行交互,所有输入都是通过与主机的连接提供的(如果两者都在同一台机器上,则通过命名管道提供,如果它们在不同的机器上,则通过TCP提供)。这种方法允许通过具有多个数据应用程序的单个主机进行分布式计算。

数据应用程序通过一个或多个插件提供数据存储方法,模拟算法等,以便轻松添加新功能。为了实现这一目标,计划是:

  • 让主机应用程序执行插件搜索。主机应该存储描述插件及其元数据的数据,但它永远不会实例化任何插件类。为了防止将程序集加载到主机应用程序中,需要以某种序列化格式存储插件的描述。
  • 数据集应用程序将从主机请求插件信息,确定要加载的所需插件,请求传输正确的程序集(分布式计算所需)并加载插件。
  • 选择正确的插件应该基于Type(如System.Type)和其他信息,如优先级等。

为了实现这一切,我认为我必须:

  • 为数据应用程序编写某种延迟加载目录(类似于Silverlight中的DeploymentCatalog)。技巧可能只是在应用程序确定需要实例化哪些类之后才请求转移和加载程序集。
  • 为主机应用程序编写自己的程序集扫描机制,以一些序列化(字符串?)格式存储插件信息,以防止插件程序集被加载到主机应用程序中。
  • 编写某种加载机制,可以选择正确的插件类,并确定如何加载它以及提供哪些构造参数。
  • 找到一些方法允许插件指定设置值(包括默认值和所述值的本地化描述)和元数据。

我想做尽可能少的工作,所以我看了一些可用的.NET插件系统。从它的外观来看,MEF似乎是最有希望的候选者。我已经阅读了MEF的架构和能力,但我仍然有点不知道我应该把注意力集中在哪里。所以我的问题是MEF的哪些部分必须定制才能使MEF按照我的计划方法工作?

1 个答案:

答案 0 :(得分:0)

事实证明,MEF缺少延迟加载插件组件所需的某些位,但是可以在应用程序的插件部分使用MEF的某些部分。

  • 通过为AppDomain.AssemblyResolve事件实现处理程序来完成组件的延迟加载。此解析程序使用现有的通信功能(在主机应用程序和数据集应用程序之间进行通信所必需的)来传输所需的程序集。
  • 插件数据的扫描和序列化按相关问题answer中的说明实施。该部分大量使用MEF来检测和序列化插件数据。
  • 在MEF中似乎无法在不实例化对象的情况下编写部件,因此应用程序的这一部分按照此answer
  • 提供的实现方式实现