2

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

数据应用通过一个或多个插件提供数据存储方式、仿真算法等,方便添加新功能。为了实现这一点,计划是:

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

为了使所有这些工作,我认为我必须:

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

我想做尽可能少的工作,因此我查看了一些可用的 .NET 插件系统。从外观上看,MEF 似乎是最有希望的候选人。我已经阅读了 MEF 的架构和能力,但对于我应该将精力集中在哪里,我仍然有些不知所措。所以我的问题是必须定制 MEF 的哪些部分才能使 MEF 与我计划的方法一起工作?

4

1 回答 1

0

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

  • 组件的延迟加载是通过实现 AppDomain.AssemblyResolve 事件的处理程序来完成的。此解析器使用现有的通信功能(在主机应用程序和数据集应用程序之间进行通信所必需的)来传输所需的程序集。
  • 插件数据的扫描和序列化按照相关问题的答案中的说明实现。这部分大量使用MEF来做插件数据的检测和序列化。
  • 在 MEF 中似乎不可能在不实例化对象的情况下组合部件,因此应用程序的这一部分是按照此答案提供的实现来实现的
于 2013-01-07T02:42:42.420 回答