如何使用mef的另一个ioc容器?

时间:2013-10-16 07:43:15

标签: wpf architecture prism mef autofac

我正在使用棱镜。我可以使用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洞。我有什么办法看不到吗?

感谢。

0 个答案:

没有答案