2016-07-31 148 views
2

我是新来的棱镜,我正在寻找一些关于在使用Prism(Prism.Forms 6.2.0预览3)与Xamarin形式时在viewModel实例化期间可用对象的指导。棱镜Xamarin形式可注射对象

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

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

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

问: 哪些对象可以自动填充在由框架视图模型实例(外INavigationService和IEventAggregator的)?谢谢。

回答

2

它看起来像这些都是你注册的实现:

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

见源here

这就是说,我只熟悉INavigationService,IEventAggregatorIPageDialogServiceILoggerFacade看起来很有趣。

查看文档here

+0

感谢您提供链接到构造函数代码和额外的注入项目。我也熟悉INavigationService,IEventAggregator和IPageDialogService。我会对这些其他注入的对象做一些额外的研究,如果我找到好的信息,请用我的答案更新帖子。我会给你一点,但我的水平太低。再次感谢。 –

+0

我想知道是否有人实现了跨平台记录器 – Shimmy

0

您可以解决在容器中注册的任何服务/对象。将您的物品注册到您的的RegisterTypes()方法中,您的PrismApplication。然后通过在构造函数中注入来解决它。

// 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:如果第三方插件不公开的抽象,你可以用一个静态的,用它来注册和解析。