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

时间:2011-05-17 15:31:35

标签: c# .net silverlight silverlight-4.0 mef

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

我在MEF documentation提供的示例中使用DeploymentCatalog并且一切都很好:插件P的XAP被异步正确下载并且导入得到满足。

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

我是否遗漏了某些内容,或者只有完全控制Silverlight应用程序和库,才能实现跨多个XAP划分应用程序?

斯特凡诺

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

将自己绑定到库中的单个依赖注入容器通常不是一个好主意,相反,您通常希望使用类似CommonServiceLocator的东西来抽象它,这样就可以选择IoC容器了谁愿意消费你的图书馆。

答案 2 :(得分:0)

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

我注意到的第一件事是CompositionHost.SatisfyImports已被CompositionInitializer.SatisfyImports取代。     其次,我找不到任何“SatisfyImports只能被调用一次”的提法     我的方案如下:

  • 我有一个BL xap,我在我的应用程序中使用/链接
  • 通过从应用程序
  • 调用SatisfyImports,BL可以满足一些Imports
  • BL也有一些进口 不能/不会解决,直到 某些习俗(第三方) module / 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。