【问题标题】:Unregister view-Viewmodel Prism xamarin dryioc注销视图-Viewmodel Prism xamarin Dryioc
【发布时间】:2019-04-07 22:59:14
【问题描述】:

我有一种情况需要取消注册 ViewModel 并重新注册。

原因是有时我想注入“假服务”而不是“真实服务”。

因此,如果我按下“离线”按钮,我需要取消注册视图模型并重新注册它们,以便使用 Fakeservices。

如何使用 prism 和 Dryioc 取消注册视图模型

我通常是这样注册的:

  protected override void RegisterTypes(Prism.Ioc.IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<MyPage,MyPageViewModel>();
}

如何取消注册上述内容?

谢谢

【问题讨论】:

    标签: prism dryioc


    【解决方案1】:

    当您使用该扩展注册您的 View 和 ViewModel 时,值得注意的是 ViewModel 本身并未注册到容器中,它仅注册到 ViewModelLocationProvider,它提供 ViewModel 类型以解析给定 View。

    这里还值得注意的是,ViewModel 是通过 Transient Lifetime 解析的,这意味着每次解析它时都会获得一个新实例,因此您真正需要做的就是导航离开然后再返回。

    【讨论】:

    • @Haukinger mm 不确定您的建议,但我会尝试。
    • 这很有趣。一旦applaunches我的viewModel将被注册,并且在调用后不久用“Real service”实例化该viewmodel现在由于某种原因在开发模式下我想通过按下按钮离线,现在我需要注入/使用fakeservice 当我想使用“fakeservice”时,你能否扩展一下我必须做的事情。我有未注册的 container.unregister();我已经注册了我的 fakeservice "container.Register" 不知道如何实现你的建议。谢谢
    • 您是说当我想切换到在视图模型中注入的“假服务”实现时,我应该简单地重新注册视图模型吗?感谢您抽出宝贵时间回复
    • 不...我是说它自己的 ViewModel 从未真正注册过...当您导航容器时只是提供它,因为它是一个具体类型...当您使用 @ 987654321@ Prism 只是映射 ViewModel 与 View 一起使用,以避免更昂贵的反射查找。
    【解决方案2】:

    原因是有时我想注入“假服务”而不是“真实服务”。

    无需注销视图模型。创建实例时注入服务。

    但无论如何,您都不应该为此使用容器 - 而是创建一个服务提供者,然后您可以将其切换到当前活动的服务。如果服务提供者自己实现服务接口,这对消费者来说甚至是透明的。

    public interface IService
    {
        void DoStuff();
    }
    
    public interface IServiceProvider
    {
        void SetActiveService( Type serviceType );
    }
    
    internal ServiceProvider : IServiceProvider, IService
    {
        void IService.DoStuff() => _currentService.DoStuff();
    
        public void SetActiveService( Type serviceType )
        {
            _currentService = _container.Resolve( serviceType );
        }
    
        private IService _currentService;
    }
    

    添加一些同步和错误处理,并为生产环境重构容器引用。

    使用 Unity,我会将提供者注册为未命名的标准实现,并将所有实际服务注册为命名实现,并将 IEnumerable&lt;Func&lt;IService&gt;&gt; 注入服务提供者。也许 DryIoc 提供了类似的功能。

    【讨论】:

    • 这是一个糟糕的建议,您不应该建议某人遵循反模式。
    • 您能详细说明一下吗?建议的IServiceProvider 不是服务定位器,而是可以在多种行为之间切换的应用程序状态。如前所述,传递类型仅用于说明目的。在生产中,应该找到其他东西来区分应用程序状态(例如,常量名称)。我宁愿说使用容器来管理应用程序状态是一种反模式。
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2019-10-06
    • 2020-08-24
    • 2019-05-19
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多