棱镜:ViewModelLocator.AutoWireViewModel ="真"不适用于未引用的程序集

时间:2015-10-09 17:25:07

标签: c# wpf prism mef

我将模块加载到引导程序中:

    protected override IModuleCatalog CreateModuleCatalog()
    {
        var moduleCatalog = new DirectoryModuleCatalog();
        moduleCatalog.ModulePath = @".\Modules";
        return moduleCatalog;
    }

在shell项目中引用模块的项目时工作正常。正确的ViewModels将由以下附加属性注入。

<UserControl prism:ViewModelLocator.AutoWireViewModel="True" [..]</>

除非删除项目引用,否则棱镜将不再设置ViewModel:ViewModelLocator.AutoWireViewModel =&#34; True&#34;。

有人知道是什么原因引起的吗?您可以在项目https://github.com/mfe-/Get.the.solution.Prism.Demo上观察此行为。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:8)

基本上,当ViewModelLocationProvider调用_defaultViewTypeToViewModelTypeResolver时,对Type.GetType(string)的调用将返回null。

这可能与MEF一般如何加载程序集有关。这似乎是MEF的常见问题,谷歌搜索将返回大量具有类似问题的结果。 这是有同样问题的人:

Type.GetType returns null when using MEF

您可以尝试在应用程序的探测路径中添加插件位置。

我个人从不使用MEF作为DI容器,因为它不是一个。但那是另一天的对话。

修改 实际上,我只是想到了解决这个问题的更好方法。只需在您的引导程序中覆盖ConfigureViewModelLocator,如下所示:

        protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();

        ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(viewType =>
        {
            var viewName = viewType.FullName;
            viewName = viewName.Replace(".Views.", ".ViewModels.");
            var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
            var suffix = viewName.EndsWith("View") ? "Model" : "ViewModel";
            var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}{1}", viewName, suffix);

            var assembly = viewType.GetTypeInfo().Assembly;
            var type = assembly.GetType(viewModelName, true);

            return type;
        });
    }

这样我们可以直接向程序集询问类型,而不是试图让框架为我们解决。