Xamarin.forms 在Dryioc中注册和注销服务

Xamarin.forms 在Dryioc中注册和注销服务,xamarin.forms,prism,dryioc,Xamarin.forms,Prism,Dryioc,我正在使用Prism.Forms在Xamarin.Forms中创建应用程序。使用Unity IOC它工作得很好。因为Unity缺少一些特性,我想转到Dryioc 因为组件(例如应用程序的页面)在运行时会发生更改,所以我需要动态注册和注销这些组件。在国际奥委会怎么做?使用Container.OpenScope似乎是可能的,但这种方法创建了Prism无法使用的新容器。Prism在整个应用程序生命周期中创建并使用单个容器。我说得对吗 那么还有其他解决办法吗 似乎可以使用Container.OpenSc

我正在使用Prism.Forms在Xamarin.Forms中创建应用程序。使用Unity IOC它工作得很好。因为Unity缺少一些特性,我想转到Dryioc

因为组件(例如应用程序的页面)在运行时会发生更改,所以我需要动态注册和注销这些组件。在国际奥委会怎么做?使用Container.OpenScope似乎是可能的,但这种方法创建了Prism无法使用的新容器。Prism在整个应用程序生命周期中创建并使用单个容器。我说得对吗

那么还有其他解决办法吗

似乎可以使用Container.OpenScope

不,DryIoc不会在作用域之间分离注册,它们总是转到根容器

您可以通过传递IfAlreadyRegistered.Replace参数来重新注册新服务。为此,您还需要修改旧注册和新注册以使用Setup.WithasResolutionCall:true。这是你的电话号码

初始设置:

container.Register<MyServiceUser>();
container.Register<IService, MyService>(
    setup: Setup.With(asResolutionCall: true));

谢谢使用OpenScope时,是否也可以从根容器解析?从我的测试看来这是不可能的。如果容器无法解析,是否可以将解析委托给我自己的工厂?使用OpenScope时,是否也可以从根容器解析?是的,这是可能的-需要看看什么不适合你。如果容器无法解析,是否可以将解析委托给我自己的工厂?是,例如container=container.Withrules=>rules.WithUnknownServiceResolversreq=>req.ServiceType!=我的类型?null:newdelegatefactory=>newmytype;var main=新容器;Registerreuse:Reuse.Scoped;使用var child=main.OpenScope{var childFoo=child.Resolve;var mainFoo=main.Resolve;Assert.arequalchildfoo,mainFoo;}抛出:当前范围不可用。感谢使用Unknown服务解析程序,它可以正常工作。我在文档中找不到关于它的信息。另外,DynamicRegistration似乎也是一个很好的解决方案。这里有一些:要使用main解析作用域服务,您需要类似ambient的内容,而不是绑定到容器作用域上下文:
container.Register<IService, MyReplacementService>(
    ifAlreadyRegistered: IfAlreadyRegistered.Replace,
    setup: Setup.With(asResolutionCall: true));