取消注册View-Viewmodel Prism xamarin dryioc

时间:2018-11-04 10:39:17

标签: prism dryioc

我遇到需要注销ViewModel并重新注册的情况。

原因是,有时我想注入“ fakeservice”而不是“真实的”。

因此,如果我按“离线”按钮,则需要注销viewModels并重新注册它们,以便使用Fakeservices。

如何使用棱镜和dryioc取消注册视图模型

我通常这样注册:

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

我如何注销以上内容?

谢谢

2 个答案:

答案 0 :(得分:0)

  

原因是,有时我想注入“ fakeservice”而不是“真实的”。

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

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

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<Func<IService>>注入到服务提供者中。也许DryIoc提供了类似的功能。

答案 1 :(得分:0)

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

在这里还值得注意的是,ViewModels是使用Transient Lifetime进行解析的,这意味着每次解析后,您都会获得一个新实例,因此,您真正需要做的就是导航并再次返回。