Prism.Navigation.INavigationService,是一个接口,无法构造
Prism.Navigation.INavigationService, is an interface and cannot be constructed
我在使用 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;
}
}
}
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: The current type,
Prism.Navigation.INavigationService, is an interface and cannot be
constructed. Are you missing a type mapping?
有谁知道怎么解决吗?
谢谢
首先,您可以尝试使 OnInitialized
异步,等待 NavigateAsync
并将整个过程包装在一个 try catch 中,并为任何异常提供调试输出。
其次,虽然您在这里看到的内容看起来是正确的,但当导航服务的名称有拼写错误时,通常会发生此错误。 Unity 注入导航服务的方式必须完全正确命名,否则将无法解析。您可以尝试从 Unity 切换到 DryIoc,看看是否能解决您的问题。它也是一个更快的 DI 容器并且实际上得到了维护!
我遇到了同样的问题。我尝试将 OnInitialized
标记为 async
并在 NavigationService.NavigateAsync
中使用 nameof
以避免拼写错误,但它没有用。万一其他人有同样的问题,我在 RegisterTypes
:
的开头添加了这一行就解决了
Container.Register<Prism.Navigation.INavigationService, Prism.Navigation.PageNavigationService>();
它将 PageNavigationService
注册为 INavigationService
的实现。
我在使用 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;
}
}
}
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: The current type, Prism.Navigation.INavigationService, is an interface and cannot be constructed. Are you missing a type mapping?
有谁知道怎么解决吗? 谢谢
首先,您可以尝试使 OnInitialized
异步,等待 NavigateAsync
并将整个过程包装在一个 try catch 中,并为任何异常提供调试输出。
其次,虽然您在这里看到的内容看起来是正确的,但当导航服务的名称有拼写错误时,通常会发生此错误。 Unity 注入导航服务的方式必须完全正确命名,否则将无法解析。您可以尝试从 Unity 切换到 DryIoc,看看是否能解决您的问题。它也是一个更快的 DI 容器并且实际上得到了维护!
我遇到了同样的问题。我尝试将 OnInitialized
标记为 async
并在 NavigationService.NavigateAsync
中使用 nameof
以避免拼写错误,但它没有用。万一其他人有同样的问题,我在 RegisterTypes
:
Container.Register<Prism.Navigation.INavigationService, Prism.Navigation.PageNavigationService>();
它将 PageNavigationService
注册为 INavigationService
的实现。