0

我正在使用带棱镜的 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 但可能与未来不兼容。当我发布新版本时,可能不会开发。

我想我是个大黑洞。有什么方法我看不到吗?

谢谢。

4

0 回答 0