首页 文章

棱镜Xamarin形成可注射物体

提问于
浏览
2

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

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

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

navigation和ea对象(上图)由Prism填充 .

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

2 回答

  • 0

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

    • INavigationService

    • IApplicationProvider

    • IModuleManager

    • IModuleInitializer

    • IEventAggregator

    • IDependencyService

    • IPageDialogService

    • ILoggerFacade

    见源here .

    话虽这么说,我只熟悉 INavigationServiceIEventAggregatorIPageDialogService . ILoggerFacade 看起来很有趣 .

    参见文档here .

  • 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:如果第三方插件没有公开抽象,你可以包装一个静态并使用它来注册和解析 .

相关问题