创建具有通过 MEF 组合的依赖项的 Silverlight 库

本文关键字:依赖 Silverlight 组合 MEF 创建 | 更新日期: 2023-09-27 17:56:35

我有一个 Silverlight 4 L它有一个依赖项,该依赖项将在运行时通过插件P提供。

我正在使用 MEF 文档提供的示例的DeploymentCatalog,一切都很好:插件P的 XAP 已异步正确下载并且满足导入。

但是,我无法控制将使用库L的 Silverlight 应用程序A的详细信息,并且我不能排除A本身可能想要使用 MEF:因此,在某些时候,A可能会出于自己的目的发出CompositionHost.SatisfyImports(...) CompositionHost.Initialize(catalog)调用,据我了解

,该调用只能调用一次。

我在这里遗漏了什么,或者只有在完全控制 Silverlight 应用程序和库的情况下才能跨多个 XAP 对应用程序进行分区?

斯特凡诺

创建具有通过 MEF 组合的依赖项的 Silverlight 库

CompositionHost.SatisfyImports可以调用很多次。 CompositionHost.Initialize 只能调用一次。 作为库,调用该方法不是一个好主意,因为应用程序可能会这样做。 由于您需要创建和使用 DeploymentCatalog,因此最好不要在库中使用 CompositionHost,因为您希望避免调用 Initialize 方法,这是将 CompositionHost 挂接到 DeploymentCatalog 的方法。

您可以创建自己的 CompositionContainer 挂接到 DeploymentCatalog,并在您创建的容器上调用 GetExports 或 SatisfyImports。 CompositionHost 几乎只是一个静态 CompositionContainer 的包装器。

自己绑定到库中的单个依赖项注入容器通常不是一个好主意,相反,您通常希望使用 CommonServiceLocator 之类的东西将其抽象出来,这使得 IoC 容器的选择成为使用您的库的人的偏好。

一个月前我才开始在 Silverlight 中使用 MEF,所以我绝对不是一个权威。

我注意到的第一件事是 CompositionHost.SatisfyImports 已被替换为 CompositionInitializer.SatisfyImports。 其次,我找不到任何关于"满足进口只能调用一次"
的引用 我的方案如下:

  • 有一个BL xap,我从我的应用程序使用/链接到它
  • BL 有一些导入,可以通过从应用程序调用 SatisfyImports 来满足
  • BL也有一些进口不能/不会解决,直到某些习俗(第三方)模块/XAP 将被加载(已加载当需求是)。当自定义模块变为可用(已加载)我用一个额外呼叫CompositionInitializer.SatisfyImports:

例如:

  If DomainSpecificModuleLogic Is Nothing Then  
     'this is required to trigger recomposition and resolve imports to the ThirdPartyModule
     System.ComponentModel.Composition.CompositionInitializer.SatisfyImports(Me)  
  End If

所以我多次调用 SatisfyImports(在不同的时间),因此没有问题 ->您不需要控制整个应用程序,只需确保当有人访问您的库中使用 MEF 的对象时,您可以调用 SatisfyImports
注意:我的BL是一个单例,所以可以肯定的是,我在同一对象上多次调用SatisfyImports。