MEF自动解析对象

时间:2017-04-10 14:04:29

标签: c# wpf mvvm mef

我需要在我的WPF应用程序中使用MEF和MVVM模式。

实际上我有一个如此定义的ViewModel:

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
class MainVM 
{        
    IServiceA serviceA;        
    IServiceB serviceB;

    [ImportingConstructor]
    public MainVM(IServiceA serviceA, IServiceB serviceB)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;

        System.Diagnostics.Debug.WriteLine(serviceA.Time);
    }
}

对于VM检索,我使用了VMLocator,因此:

class ViewModelLocator
{
    static ViewModelLocator instance;

    public MainVM MainVM
    {
        get
        {
            MainVM output = MefBootstrap.Container.GetExportedValue<MainVM>();
            return output;
        }
    }

    protected ViewModelLocator()
    {

    }

    public static ViewModelLocator Instance
    {
        get
        {
            return instance ?? (instance = new ViewModelLocator());
        }
    }
}

从XAML调用:

DataContext="{Binding Source={x:Static provider:ViewModelLocator.Instance}, Path=MainVM}"

此代码确实有效。

我想知道是否可以实现在VMLocator的属性声明中仅使用MEF ExportAttribute [Import] 而不是使用 GetExportValue()方法自动导入VM。

有任何解决方案吗?

1 个答案:

答案 0 :(得分:1)

由于您手动创建ViewModelLocator,因此无效。由于您手动创建 IoC(MEF)无法控制此实例创建,因此它不会[Import]从容器MainVM依赖(property)到您的{{1} }。

所以要解决“有没有解决方案?”的问题:

Here是如何在MVVM上下文中利用MEF的示例。

我强烈建议你选择PRISM。它已经为你完成了它。我宁愿不重新发明这个轮子。