我遇到需要注销ViewModel并重新注册的情况。
原因是,有时我想注入“ fakeservice”而不是“真实的”。
因此,如果我按“离线”按钮,则需要注销viewModels并重新注册它们,以便使用Fakeservices。
如何使用棱镜和dryioc取消注册视图模型
我通常这样注册:
protected override void RegisterTypes(Prism.Ioc.IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MyPage,MyPageViewModel>();
}
我如何注销以上内容?
谢谢
答案 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进行解析的,这意味着每次解析后,您都会获得一个新实例,因此,您真正需要做的就是导航并再次返回。