我正在尝试使我的Xamarin项目在Prism和DryIoc上使用MVVM。
我主要想使用自动注册,如下所示:
[AutoRegisterForNavigation]
...
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//Pages
containerRegistry.RegisterForNavigation<NavigationPage>();
//Services
containerRegistry.RegisterSingleton<ILocalDatabase, LocalDatabase>();
containerRegistry.RegisterSingleton<IUserProfileDataStore, UserProfileDataStore>();
containerRegistry.RegisterSingleton<IApplicationSettings, ApplicationSettings>();
containerRegistry.RegisterSingleton<ILogger, Logger>();
containerRegistry.RegisterSingleton<IApiService, ApiService>();
containerRegistry.RegisterSingleton<IUserSession, UserSession>();
containerRegistry.Register<IBrowser, BrowserImplementation>();
containerRegistry.Register<IConnectivity, ConnectivityImplementation();
containerRegistry.Register<IFileSystem, FileSystemImplementation>();
containerRegistry.Register<ICoreServices, CoreServices>();
}
我也尝试过手动注册:
containerRegistry.RegisterForNavigation<LoginPage, LoginPageViewModel>();
均不起作用,它会击中后面的“登录页面”代码,并因以下错误而中断:
Exception - High: Prism.Ioc.ContainerResolutionException:
An unexpected error occurred while resolving 'AppetiteApp.ViewModels.LoginPageViewModel' --->
DryIoc.ContainerException: code: UnableToResolveUnknownService; message: Unable to resolve
Resolution root AppetiteApp.ViewModels.LoginPageViewModel
with passed arguments [value(Prism.Navigation.ErrorReportingNavigationService)]
**System.NullReferenceException:** 'Object reference not set to an instance of an object.'
我也尝试过使用链接器文件将其构建动作设置为“ linkdescription”
至于我的登录页面,这里是声明
public LoginPageViewModel(ICoreServices coreServices)
: base(coreServices)
答案 0 :(得分:1)
LoginPageViewModel
的构造函数需要注册的ICoreServices
参数。
错误消息表明LoginPageViewModel
本身对IoC来说是未知的-这意味着类型LoginPageViewModel
并未直接注册,也无法通过动态注册或未知的服务解析器找到。
我不是Xamarin Prism的用户,所以我不确定其注册视图模型的机制。
顺便说一句,这部分错误
解决方案根AppetiteApp.ViewModels.LoginPageViewModel 带有传递的参数[value(Prism.Navigation.ErrorReportingNavigationService)]
基本上意味着视图模型是通过以下调用resolver.Resolve(typeof(LoginPageViewModel), args: new[] { errorReportingNavigationService })
希望它可以帮助您或Xamarin知识渊博的人跟踪错误原因。
答案 1 :(得分:0)
因此,一旦我在 ICoreServices 内部进行了调查,我便注释掉了每个依赖项,然后发现 IUserSession 是造成问题的一次原因,然后我深入研究了该依赖关系 App.Xaml.cs 注册类型中缺少 IAppInfo 和 IVersionTracking 的内容,所以我添加了它,然后它就起作用了!
containerRegistry.Register<IAppInfo, AppInfoImplementation>();
containerRegistry.Register<IVersionTracking, VersionTrackingImplementation>();