使用PRISM Xamarin Forms进行的依赖项注入不起作用

时间:2019-12-10 18:32:17

标签: xamarin.forms dependency-injection prism

我的项目中有依赖项注入问题。我在项目中使用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>();
    }

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

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

这里有问题。当我传递给RegistrationViewModel()构造函数时,除了INavigationService navigationService之外,不会显示RegistrationView页面。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

现在您如何处理这种情况?

您需要告诉DI框架如何解析IUserDataInterface。由于RegistrationPageViewModel实际上并未使用它,因此您可以注册null

containerRegistry.RegisterInstance<IValidationService>(null);

稍后可能会令人讨厌。我宁愿完全删除RegistrationPageViewModelIUserDataService的依赖关系-现在暂时在实际使用时添加它-或创建一个实现IUserDataService并使用了很长时间的模拟/存根没有真正的实现。就像使用IValidationService一样,它会在DI框架中注册。