Dependency injection Prism Xamarin表单导航服务,DependencyService

Dependency injection Prism Xamarin表单导航服务,DependencyService,dependency-injection,xamarin.forms,prism,Dependency Injection,Xamarin.forms,Prism,正如Prism所说 要在ViewModels中获得INavigationService,只需请求即可 作为构造函数参数 像这样: public SpeakPageViewModel(INavigationService navigationService) : base(navigationService) { _navigationService = navigationService; } 我想使用ITextToSpeech接口作为Prism示例: public MainPageV

正如Prism所说

要在ViewModels中获得INavigationService,只需请求即可 作为构造函数参数

像这样:

public SpeakPageViewModel(INavigationService navigationService) : base(navigationService)

{

_navigationService = navigationService;

}
我想使用ITextToSpeech接口作为Prism示例:

public MainPageViewModel(ITextToSpeech textToSpeech)
{
    _textToSpeech = textToSpeech;
    SpeakCommand = new DelegateCommand(Speak);
}

问题是:向构造函数添加另一个参数时,导航不起作用

public SpeakPageViewModel(ITextToSpeech textToSpeech, INavigationService navigationService) : base(navigationService)
        {
            _navigationService = navigationService;
            _textToSpeech = textToSpeech;
        }

项目文件:

Prism 7更改了此行为,因为依赖辅助容器实际上是一种反模式。您只需在
IPlatformInitializer
中注册TextToSpeech服务,如:

public class iOSInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.Register<ITextToSpeech, TextToSpeech_iOS>();
    }
}
公共类IOS初始值设定项:IPlatformInitializer
{
公共无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.Register();
}
}

Prism 7改变了这种行为,因为它实际上是一种依赖于辅助容器的反模式。您只需在
IPlatformInitializer
中注册TextToSpeech服务,如:

public class iOSInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.Register<ITextToSpeech, TextToSpeech_iOS>();
    }
}
公共类IOS初始值设定项:IPlatformInitializer
{
公共无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.Register();
}
}

是否尝试将
导航服务
作为第一个参数?希望这不重要,但既然命名要求也存在。@GeraldVersluis是的,我有。没有区别。不工作您使用的是哪个容器?你能提供一个回购应用程序来演示这个问题吗?@DanS。我已经添加了项目文件link@DanS. 我已经测试了DryIco和Unity,但仍然存在问题。这对我来说太奇怪了!您是否尝试将
navigationService
作为第一个参数?希望这不重要,但既然命名要求也存在。@GeraldVersluis是的,我有。没有区别。不工作您使用的是哪个容器?你能提供一个回购应用程序来演示这个问题吗?@DanS。我已经添加了项目文件link@DanS. 我已经测试了DryIco和Unity,但仍然存在问题。这对我来说太奇怪了!嘿,Dan.S,请回答以下两个问题:1-如果向从ViewModelBase派生的MainPageViewmodel构造函数添加int参数或任何类型的变量或对象,也会引发错误。如何注册变量?!你为什么这样做?!2-我在哪里可以很好地学习Prism?除非您为该ViewModel类型的容器添加了特定的注册,否则无法将基本值直接传递到ViewModel的构造函数中。除此之外,我无法为您提供更多帮助,因为它变得非常特定于容器,完全超出了这个问题的范围。至于在哪里学习。当然,GitHub上有一些示例。许多开发人员都从Prism Slack频道中受益,您可以通过成为Prism用户加入该频道。除此之外,您还可以聘请像我这样的顾问来帮助启动您的团队。嘿,Dan.S,请回答以下两个问题:1-如果向从ViewModelBase派生的MainPageViewmodel构造函数添加int参数或任何类型的变量或对象,也会引发错误。如何注册变量?!你为什么这样做?!2-我在哪里可以很好地学习Prism?除非您为该ViewModel类型的容器添加了特定的注册,否则无法将基本值直接传递到ViewModel的构造函数中。除此之外,我无法为您提供更多帮助,因为它变得非常特定于容器,完全超出了这个问题的范围。至于在哪里学习。当然,GitHub上有一些示例。许多开发人员都从Prism Slack频道中受益,您可以通过成为Prism用户加入该频道。除此之外,你还可以聘请像我这样的顾问来帮助组建你的团队。