我正在使用棱镜。我可以使用mef因为我喜欢导出,导入,元数据属性以及大多数聚合cagalog用法。所以我想在棱镜项目中使用mef。
在我的计划中,我的解决方案项目必须使用autofac或城堡windsor ioc容器,除了棱镜项目(wpf)之外,我的实现方式与此类似。在这种情况下,我不喜欢使用autofac或城堡windsor而不是mef的默认di / ioc,但是太多的个人实验的替代用法都失败了。
我可以使用任何稳定的样本项目吗?我只想用mef功能来改变mef的ioc。
我的经典mef bootstrapper代码如下 Imports System.ComponentModel.Composition.Hosting 导入Microsoft.Practices.Prism.MefExtensions 导入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
现在,每个人都像预期的那样工作。
修改/覆盖的bootstrapper的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或其他代码库尝试从servicelocator解析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,但也许它未来兼容。当mef'新版本发布时,可能不会发展。
我认为我是一个很大的blakc洞。我有什么办法看不到吗?
感谢。