Prism.Unity.Forms 将 INavigationService 注入 ViewModel 构造函数
Prism.Unity.Forms injecting INavigationService to ViewModel constructor
代码片段 1:
public MainPageViewModel(INavigationService navigationService)
{
this._navigationService = navigationService;
}
代码片段 2:
public MainPageViewModel(INavigationService navService)
{
this._navigationService = navService;
}
谁能解释为什么 Code Snippet 1
有效但 Code Snippet 2
抛出异常 (System.NullReferenceException: Object reference not set to an instance of an object.
)?
两者之间的唯一区别是构造函数中的参数名称。
P.S。我正在使用 Prism 6.2.0
每个 DI 容器的工作方式略有不同,但是 INavigationService
是 Prism.Forms 中的一项独特服务。 Prism 在解耦您的视图和视图模型方面非常重要。也就是说,实际上 INavigationService 需要了解 View 才能正常运行。因此,注入到 ViewModel 中的 INavigationService
实例实际上是通过 PrismApplication 中名为 ConfigureViewModelLocator
的工厂方法构造的,然后注入到 ViewModel 中。
正是由于这个原因,它是一个命名服务,并且在 Unity 的情况下,为什么它必须是构造函数中的第一个参数。请参阅 ConfigureViewModelLocator
方法以更全面地了解这里发生的事情。
代码片段 1:
public MainPageViewModel(INavigationService navigationService)
{
this._navigationService = navigationService;
}
代码片段 2:
public MainPageViewModel(INavigationService navService)
{
this._navigationService = navService;
}
谁能解释为什么 Code Snippet 1
有效但 Code Snippet 2
抛出异常 (System.NullReferenceException: Object reference not set to an instance of an object.
)?
两者之间的唯一区别是构造函数中的参数名称。
P.S。我正在使用 Prism 6.2.0
每个 DI 容器的工作方式略有不同,但是 INavigationService
是 Prism.Forms 中的一项独特服务。 Prism 在解耦您的视图和视图模型方面非常重要。也就是说,实际上 INavigationService 需要了解 View 才能正常运行。因此,注入到 ViewModel 中的 INavigationService
实例实际上是通过 PrismApplication 中名为 ConfigureViewModelLocator
的工厂方法构造的,然后注入到 ViewModel 中。
正是由于这个原因,它是一个命名服务,并且在 Unity 的情况下,为什么它必须是构造函数中的第一个参数。请参阅 ConfigureViewModelLocator
方法以更全面地了解这里发生的事情。