【问题标题】:Prism.Navigation.INavigationService, is an interface and cannot be constructedPrism.Navigation.INavigationService,是接口,不能构造
【发布时间】:2017-09-26 19:23:58
【问题描述】:

我在使用 MVVM Prism 时遇到了一个奇怪的异常。

这是我的代码:

LoginPageViewModel.cs 文件:

    using Prism.Commands;
    using Prism.Mvvm;
    using Prism.Navigation;
    using Prism.Services;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using Xamarin.Forms;
    using Prism.Unity;
    using Microsoft.Practices.Unity;
    using System.Threading.Tasks;
    using MobileApp.Views;

    namespace MobileApp.ViewModels
    {
        public class LoginPageViewModel : BindableBase, INavigationAware
        {

            .
            .
            .
            private INavigationService _navigationService;

            public LoginPageViewModel(INavigationService navigationService, ...)
            {
                .
                .
                .
                _navigationService = navigationService;
            }
        }
    }

我调用 LoginPage 的 App.xaml.cs 文件:

    using Prism.Unity;
    using MobileApp.Views;
    using Xamarin.Forms;
    using System;
    using System.Globalization;
    using Microsoft.Practices.Unity;
    using Prism.Navigation;
    using Microsoft.Practices.ServiceLocation;
    using System.Diagnostics;
    using MobileApp.ViewModels;
    using System.Threading.Tasks;

    namespace MobileApp
    {
        public partial class App : PrismApplication
            {
                public App(IPlatformInitializer initializer = null) : base(initializer)
                {

                }

                protected override void OnInitialized()
                {
                    NavigationService.NavigateAsync("LoginPage"); // ERROR here (Exception)
                    .
                    .
                    .
                }

                protected override void RegisterTypes()
                {

                    Container.RegisterTypeForNavigation<NavigationPage>();
                    Container.RegisterTypeForNavigation<LoginPage>();
                    .
                    .
                    .
                }
        }
    }

在 NavigationService.NavigateAsync("LoginPage") 调用之后,我收到此错误:

System.InvalidOperationException:当前类型, Prism.Navigation.INavigationService,是接口,不能 建。您是否缺少类型映射?

有人知道怎么解决吗? 谢谢

【问题讨论】:

  • 您是否缺少类型映射?我认为您缺少类型映射。您缺少类型映射,不是吗?您缺少类型映射。映射您的类型。
  • 确保您使用 ViewModelLocator 设置 bindindCONtext,而不是尝试在代码隐藏中手动设置它。

标签: c# xamarin mvvm prism


【解决方案1】:

首先,您可以尝试使 OnInitialized 异步,等待 NavigateAsync 并将整个事情包装在 try catch 中,并为任何异常提供调试输出。

其次,虽然您在此处看到的内容看起来是正确的,但此错误通常发生在导航服务名称中有错字时。 Unity 注入导航服务的方式必须完全正确命名,否则将无法解析。您可以尝试从 Unity 切换到 DryIoc,看看是否能解决您的问题。它也是一个更快的 DI 容器并且实际上得到了维护!

【讨论】:

  • 参数名称起如此重要的作用很奇怪!
  • 这是 Unity 的限制。例如,DryIoc 没有任何此类限制。
【解决方案2】:

我遇到了同样的问题。我尝试将OnInitialized 标记为async 并在NavigationService.NavigateAsync 中使用nameof 以避免拼写错误,但没有成功。万一其他人有同样的问题,我在RegisterTypes开头添加这一行时解决了它:

Container.Register<Prism.Navigation.INavigationService, Prism.Navigation.PageNavigationService>();

它将PageNavigationService 注册为INavigationService 的实现。

【讨论】:

  • 谢谢。我也遇到了这个问题,当我在 OnStart 期间尝试将导航服务用作另一个服务的依赖项时,它似乎没有注册,但奇怪的是 NavigationService 属性在那个时候确实有效并且它当时在容器中但不会'由于某种原因不能解析为构造函数注入。这解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2011-11-05
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多