我有一个Silverlight 4 库 L
,它具有在运行时通过插件P
提供的依赖项。
我在MEF documentation提供的示例中使用DeploymentCatalog
并且一切都很好:插件P
的XAP被异步正确下载并且导入得到满足。
但是,我无法控制将使用库A
的Silverlight应用程序L
的详细信息,我不能排除A
本身可能想要使用MEF:因此可能在某些时候,A
可能会针对自己的目的发出 CompositionHost.SatisfyImports(...)
CompositionHost.Initialize(catalog)
调用,我理解只能调用一次。
我是否遗漏了某些内容,或者只有完全控制Silverlight应用程序和库,才能实现跨多个XAP划分应用程序?
斯特凡诺
答案 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只能被调用一次”的提法 我的方案如下:
例如:
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。