xamarin.forms - 使用 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 页面。我究竟做错了什么?
解决方案
假设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);
不过,以后可能会很烦人。我宁愿完全删除对RegistrationPageViewModel
to的依赖IUserDataService
- 现在并在以后实际使用时添加它 - 或者创建一个实现IUserDataService
并在没有真正实现的情况下使用的模拟/存根。这将在 DI 框架中注册,就像您使用IValidationService
.
推荐阅读
- here-api - 使用历史实时数据获取路线
- c# - C# Datatable linq - 任何地方
- firebase - firebase 分析:找到 app_remove 的用户 ID
- nginx - RTMP 到 HLS 多变体的问题
- javascript - 需要了解为什么内联函数的 Promise 结果无法解析为预期的返回结果
- java - 收到错误为“SQL 状态:08001 找不到适合 jdbc:oracle:thin:@128:23:44:01:12345:pppp_rr 的驱动程序
- python - 当我运行相同的 python 代码但在 for 循环中时,为什么我的 matplotlib 条形图会发生变化
- swift - 如何在 Swift 中隐藏“共享连接”栏?
- android - 如何在 Android OpenGL ES3.0 中向表面添加位图/图像纹理?
- javascript - 使用 KonvaJS 删除应用的过滤器