Xamarin.forms 使用PRISM Xamarin表单的依赖注入不';行不通

Xamarin.forms 使用PRISM Xamarin表单的依赖注入不';行不通,xamarin.forms,dependency-injection,prism,Xamarin.forms,Dependency Injection,Prism,我的项目中存在依赖项注入问题。我在我的项目中使用PRISM框架,并且在创建它时选择了Ioc容器。链接-> 在我的app.xaml文件中,我将类和接口关联起来 protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation(); containerRegistry.RegisterForNavigation<Welcome

我的项目中存在依赖项注入问题。我在我的项目中使用PRISM框架,并且在创建它时选择了Ioc容器。链接-> 在我的app.xaml文件中,我将类和接口关联起来

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation<WelcomeView, WelcomeViewModel>();
containerRegistry.RegisterForNavigation<RegistrationView, RegistrationViewModel>();
containerRegistry.RegisterForNavigation<LoginView, LoginViewModel>();

//regestering
        containerRegistry.RegisterSingleton<IValidationService, ValidationService>();
    }

这里有点不对劲。当我传递给RegistrationViewModel()构造函数时,除了INavigationService navigationService之外的另一个参数不会显示RegistrationView页面。我做错了什么?

假设
WelcomePage
显示正确,而
RegistrationPage
显示不正确,我认为安德烈斯·卡斯特罗是正确的:Prism试图解决
IUserDataService
,这是不可能的。在调试输出中,您应该看到一条消息,
IUserDataService
无法解析

注意:以下内容基于我对Prism和Unity的经验。这可能适用于其他依赖注入框架,但其他框架的行为可能有所不同。)

Prism依赖依赖依赖注入(DI)框架,例如Microsofts Unity应用程序块。当您尝试导航到
注册页面
时发生的情况是,Prism(如果您使用的是
ViewModelLocator.AutowireViewModel=“True”
)尝试确定viewmodel的类型(按约定)并要求基础DI框架解析此类型(即创建实例)。对于这种类型的每个必需构造函数参数,DI框架再次尝试解析它们。如果参数需要具体类型,它将尝试解决这些问题。如果参数需要接口(或抽象)类型,DI框架将查看其注册,如果类型已注册,则根据该注册创建实例(这反过来可能涉及解析其他类型)

但是,如果参数需要未注册的接口类型,DI框架不知道如何处理这种情况。它当然可以假定
null
,但这可能会导致更难跟踪的错误,因此它将抛出异常(由Prism吞下并记录)

现在你如何处理这种情况? 您需要告诉DI框架如何解析
IUserDataInterface
。因为
RegistrationPageViewModel
实际上没有使用它,所以您可以注册
null

containerRegistry.RegisterInstance(空);

不过,以后可能会很恼火。我宁愿将
RegistrationPageViewModel
IUserDataService
的依赖关系全部删除-现在,在实际使用时添加它-或者创建一个实现
IUserDataService
的模拟/存根,只要没有真正的实现就可以使用。这将是regi与您使用
IValidationService

一样熟悉DI框架,假设
WelcomePage
显示正确,而
RegistrationPage
显示不正确,我认为Andres Castro是正确的:Prism尝试解决
IUserDataService
,这是不可能的。在调试输出中,您应该看到一个消息无法解析
IUserDataService
的错误

注意:以下内容基于我对Prism和Unity的经验。这可能适用于其他依赖注入框架,但其他框架的行为可能有所不同。)

Prism依赖于依赖项注入(DI)框架,例如Microsofts Unity应用程序块。当您尝试导航到
RegistrationPage
时发生的情况是,Prism(如果您使用的是
ViewModelLocator.AutowireViewModel=“True”
)尝试确定viewmodel的类型(按约定)并要求基础DI框架解析此类型(即创建实例)。对于此类型的每个必需构造函数参数,DI框架再次尝试解析它们。如果参数需要具体类型,则将尝试解析这些类型。如果参数需要接口(或抽象)类型,DI框架将查看其注册,如果已经注册了类型,则根据该注册创建实例(这反过来可能涉及解析其他类型)

但是,如果参数需要未注册的接口类型,DI框架不知道如何处理这种情况。它当然可以假定
null
,但这可能会导致更难跟踪的错误,因此它将抛出异常(由Prism吞下并记录)

现在你如何处理这种情况? 您需要告诉DI框架如何解析
IUserDataInterface
。因为
RegistrationPageViewModel
实际上没有使用它,所以您可以注册
null

containerRegistry.RegisterInstance(空);

不过,以后可能会很恼火。我宁愿将
RegistrationPageViewModel
IUserDataService
的依赖关系全部删除-现在,在实际使用时添加它-或者创建一个实现
IUserDataService
的模拟/存根,只要没有真正的实现就可以使用。这将是regi你没有注册IUserDataService,因此PRISM找不到匹配的构造函数。从你的代码中我可以看到,要显示的第一个页面应该是
WelcomePage
,对吗?
WelcomePage
显示正确吗?我真的没有注册r Android项目中的另一项服务。谢谢!您没有注册IUserDataService,因此PRISM找不到匹配的构造函数。从您的代码中我可以看到,显示的第一页应该是
WelcomePage
,正确吗
public RegistrationViewModel(INavigationService navigationService, IUserDataService userDataService,
IValidationService validationService) :
base(navigationService)
{
_userDataService = userDataService;
_validationService = validationService;
}