我正在使用带棱镜的 mef。我可以使用 mef,因为我喜欢导出、导入、元数据属性,并且主要是聚合 cagalog 的使用。所以我想将 mef 与 prism 项目一起使用。
在我的计划中,我的解决方案项目必须使用 autofac 或 castle windsor ioc 容器,除了 prism 项目(wpf)之外,我的实现方式类似。以防万一,我不喜欢使用 autofac 或 castle windsor 而不是 mef 的默认 di/ioc,但是个人实验的太多替代用法都失败了。
我可以使用任何稳定的示例项目吗?我只想更改具有所有 mef 功能的 mef 的 ioc。
我的经典 mef 引导程序代码如下 Imports System.ComponentModel.Composition.Hosting Imports Microsoft.Practices.Prism.MefExtensions Imports Microsoft.Practices.ServiceLocation
Public Class Bootstrapper2
Inherits MefBootstrapper
Protected Overrides Sub ConfigureContainer()
MyBase.ConfigureContainer()
Dim ag As New AggregateCatalog()
ag.Catalogs.Add(New AssemblyCatalog(GetType(Bootstrapper2).Assembly))
ag.Catalogs.Add(New DirectoryCatalog("..\..\modules\", "Prism.Sample.Modules.*.dll"))
Me.AggregateCatalog.Catalogs.Add(ag)
End Sub
Protected Overrides Function CreateShell() As DependencyObject
Dim s As Shell = ServiceLocator.Current.GetInstance(Of Shell)()
Return s
End Function
Protected Overrides Sub InitializeShell()
Application.Current.MainWindow = Shell()
Application.Current.MainWindow.Show()
End Sub
End Class
Shell 的代码如下: Imports System.ComponentModel.Composition
<Export()> _
Public Class Shell
Sub New()
InitializeComponent()
End Sub
<Import(AllowRecomposition:=False)> _
Public Property ViewModel() As ShellViewModel
Get
Return CType(Me.DataContext, ShellViewModel)
End Get
Set(value As ShellViewModel)
Me.DataContext = value
End Set
End Property
End Class
现在,一切都像预期的那样工作。
修改/覆盖引导程序的 ConfigureServiceLocator() 方法如下。
Private autofacBuilder As New Autofac.ContainerBuilder
Protected Overrides Sub ConfigureServiceLocator()
Dim autofacContainer = autofacBuilder.Build()
Dim autofacSL = New Prism.AutofacExtension.AutofacServiceLocatorAdapter(autofacContainer)
ServiceLocator.SetLocatorProvider(Function() autofacSL)
End Sub
然后我得到了太多解决异常,例如:异常消息:尝试获取 RegionAdapterMappings 类型的实例时发生激活错误,键“”。
Prism 或其他代码库试图从服务定位器解析 IRegionAdapterMappings,但当前服务定位器不知道这是什么。因为 mef 在 CreateServiceLocator 之前已经注册了这个类型((ConfigureContainer)。
所以,然后我尝试添加 mef 的聚合目录以向 Autofac.Integration.Mef 项目注册 autofac 容器,如下所示:
Private autofacBuilder As New Autofac.ContainerBuilder
Protected Overrides Sub ConfigureServiceLocator()
autofacBuilder.RegisterComposablePartCatalog(Me.AggregateCatalog)
Dim autofacContainer = autofacBuilder.Build()
Dim autofacSL = New Prism.AutofacExtension.AutofacServiceLocatorAdapter(autofacContainer)
ServiceLocator.SetLocatorProvider(Function() autofacSL)
End Sub
然后我有一个不同的例外: IServiceLocator 未注册等...
我没有更改 mef 的 ioc 容器的完全解决方案,因为它自己的容器类型并使用她自己的可扩展性。尝试使用 Autofac.Integration.Mef 但可能与未来不兼容。当我发布新版本时,可能不会开发。
我想我是个大黑洞。有什么方法我看不到吗?
谢谢。