【问题标题】:Prism Xamarin Forms injectable objectsPrism Xamarin Forms 可注射对象
【发布时间】:2016-12-05 23:17:13
【问题描述】:

我是 Prism 的新手,我正在寻找有关在将 Prism(Prism.Forms 6.2.0 预览版 3)与 Xamarin Forms 一起使用时在 viewModel 实例化期间可用对象的一些指导。

我看到导航到视图/视图模型时,框架提供了 INavigationService 和 IEventAggregator 参数值。请参阅下面的代码以获取说明。

 public ViewBViewModel(INavigationService navigationService, IEventAggregator ea)
    {
        _ea = ea;
        _navigationService = navigationService;
    }

navigationService 和 ea 对象(上图)由 Prism 填充。

问题: 框架可以在 viewModel 实例中自动填充哪些其他对象(INavigationService 和 IEventAggregator 之外)?谢谢。

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    看起来这些是为您注册的实现:

    • INavigationService
    • IApplicationProvider
    • IModuleManager
    • IModuleInitializer
    • IEventAggregator
    • IDependencyService
    • IPageDialogService
    • ILoggerFacade

    见源here

    话虽如此,我只熟悉INavigationServiceIEventAggregatorIPageDialogServiceILoggerFacade 看起来很有趣。

    请参阅文档here

    【讨论】:

    • 感谢您提供指向构造函数代码和其他注入项的链接。我也熟悉 INavigationService、IEventAggregator 和 IPageDialogService。如果我找到好的信息,我将对这些其他注入的对象进行一些额外的研究,并用我的答案更新帖子。我会给你一个分数,但我的水平太低了。再次感谢。
    【解决方案2】:

    您可以解析向容器注册的任何服务/对象。在PrismApplicationApp.xaml.csRegisterTypes() 方法中注册您的对象。然后通过注入你的构造函数来解决它。

    // Register
       Container.RegisterType<IYourObject, YourObject>();
    
    // Resolve
       public SomeClass(IYourObject yourObject) 
       {
          _yourObject = yourObject;
       }
    

    如果您有特定于平台的依赖项,则在您的应用初始化程序中注册这些服务,例如在 iOS 中,您的 AppDelegate.cs 将像这样加载 Xamarin.Forms 应用程序,

    ...
    
    LoadApplication(new App(new iOSAppInitializer()));
    
    ...
    

    初始化器可能如下所示

    public class iOSAppInitializer : IPlatformInitializer
    {
       public void RegisterTypes (IUnityContainer container)
       {
           container.RegisterType<IMyService, MyService> ();
       }
    }
    

    另外,您可以将第三方插件注册为RegisterInstance 并将它们也注入您的类中。例如,假设您使用Acr.UserDialogs 插件进行警报,而不是在任何地方使用static 实例(这将使单元测试变得有趣),您可以简单地将其注册到您的容器中

    RegisterInstance<IUserDialogs>(UserDialogs.Instance);
    

    并在需要的地方注入它。

    public SomeClass(IUserDialogs userDialogs)
    {
       _userDialogs = userDialogs;
    }
    

    PS:如果第三方插件没有暴露抽象,你可以包装一个静态并使用它来注册和解析。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2018-02-09
      • 2018-10-19
      • 2018-10-25
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多