棱镜Xamarin形成可注射物体

时间:2016-07-31 23:38:40

标签: xamarin.forms prism

我是Prism的新手,当我在使用带有Xamarin Forms的Prism(Prism.Forms 6.2.0 Preview 3)时,我正在查找viewModel实例化期间可用对象的一些指导。

我看到在导航到view / viewmodel时框架提供了INavigationService和IEventAggregator参数值。请参阅下面的代码以获取说明。

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

导航服务和ea对象(上图)由Prism填充。

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

2 个答案:

答案 0 :(得分:2)

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

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

请参阅来源here

话虽这么说,我只熟悉let data = 0.0 c.execute('DELETE FROM IllnessesView WHERE CurrentSymptom=?', (data,)) INavigationServiceIEventAggregatorIPageDialogService看起来很有趣。

请参阅文档here

答案 1 :(得分:0)

您可以解析向容器注册的任何服务/对象。使用RegisterTypes() App.xaml.cs PrismApplication方法中的容器注册您的对象。然后通过注入构造函数来解决它。

// Register
   Container.RegisterType<IYourObject, YourObject>();

// Resolve
   public SomeClass(IYourObject yourObject) 
   {
      _yourObject = yourObject;
   }

如果你有一个特定于平台的依赖项,那么在你的app初始化程序中注册这些服务,例如在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:如果第三方插件没有公开抽象,你可以包装静态并使用它来注册和解析。