首页 > 解决方案 > 使用 PRISM Xamarin Forms 的依赖注入不起作用

问题描述

我的项目中存在依赖注入问题。我在我的项目中使用 PRISM 框架,并在创建它时选择了 Ioc 容器。链接 - > https://github.com/blackpantific/InstagroomEX 在我的 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>();
    }

但是我在 initializing() 之后的页面没有出现在屏幕上。这是 ViewModel 构造函数

public RegistrationViewModel(INavigationService navigationService, IUserDataService userDataService,
IValidationService validationService) :
base(navigationService)
{
_userDataService = userDataService;
_validationService = validationService;
}

这里有问题。当我向 RegistrationViewModel() 构造函数传递除 INavigationService 导航服务之外的另一个参数时,不会显示 RegistrationView 页面。我究竟做错了什么?

标签: xamarin.formsdependency-injectionprism

解决方案


假设WelcomePage显示正确RegistrationPage而不正确,我认为 Andres Castro 是正确的:Prism 试图解决IUserDataService不可能的问题。在调试输出中,您应该看到一条IUserDataService无法解析的消息。

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

Prism依赖于依赖注入 ( DI ) 框架,例如 Microsoft 的Unity应用程序块。当您尝试导航到RegistrationPagePrism 时会发生什么(如果您使用ViewModelLocator.AutowireViewModel="True") 尝试确定视图模型的类型(按照惯例)并要求底层 DI 框架解析这种类型(即创建一个实例)。对于这种类型的每个必需的构造函数参数,DI 框架再次尝试解析它们。如果参数需要具体类型,它将尝试解决这些问题。如果参数需要接口(或抽象)类型,DI 框架将查看其注册,如果类型已注册,则根据此注册创建实例(这反过来可能涉及解析其他类型)。

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

现在你怎么能处理这种情况?

您需要告诉 DI 框架如何解决IUserDataInterface. 由于RegistrationPageViewModel实际上并没有使用它,您可以注册null

containerRegistry.RegisterInstance<IValidationService>(null);

不过,以后可能会很烦人。我宁愿完全删除对RegistrationPageViewModelto的依赖IUserDataService- 现在并在以后实际使用时添加它 - 或者创建一个实现IUserDataService并在没有真正实现的情况下使用的模拟/存根。这将在 DI 框架中注册,就像您使用IValidationService.


推荐阅读