我对MVVM PPRISM还是很陌生,我正在重写一个使用MVVMLight SimpleIOC的项目。在MVVM Light中进行注册时,我具有以下代码行,并且我怀疑这是否是在MVVM Prims的DryIOC中进行转换的正确方法。
SimpleIoc.Default.Register< iClassA, ClassA >();
SimpleIoc.Default.Register< iClassB, ClassB >();
// The factory method is necessary to prevent the linker from removing the class A constructor
SimpleIoc.Default.Register<IClassC>(() => new ClassC(SimpleIoc.Default.GetInstance<IClassA>(), SimpleIoc.Default.GetInstance<IClassB>()));
我的问题是containerRegistry.GetContainer().Resolve<IClassInterface>()
是否是从SimpleIoc.Default.GetInstance< IClassInterface >()
转换的正确方法
containerRegistry.Register<iClassA, ClassA>();
containerRegistry.Register<iClassB, ClassB>();
containerRegistry.RegisterInstance<ClassC>(new ClassC((iClassA)containerRegistry.GetContainer().Resolve<iClassA>(), (iClassB)containerRegistry.GetContainer().Resolve<iClassB >()));
答案 0 :(得分:1)
所以您似乎在这里有两个问题,所以我将尝试回答每个部分:
在MVVM Light中进行注册时,我具有以下代码行,并且我怀疑这是否是在MVVM Prims的DryIOC中进行转换的正确方法。
Prism的IContainerRegistry是围绕容器的抽象层,无论您与Prism一起使用哪个DI容器,它都使绝大多数注册保持一致。这也使添加对不同容器的支持变得更加容易,因为Prism概述了我们希望容器能够支持的接口。
例如您拥有的地方:
SimpleIoc.Default.Register<iClassA, ClassA>();
理论上,这将映射为等效项:
containerRegistry.Register<iClassA, ClassA>();
因为要处理抽象层,所以后备容器是DryIoc,Unity还是什至是SimpleIoc的自定义实现,都没关系。
现在,如果您需要访问某些特定于容器的API,则可以始终调用GetContainer()
扩展名来访问基础容器(假设您使用的是DryIoc或Unity)。
因此,如果您的容器有一个名为Resolve的方法,该方法返回类型,那么可以,您可以到容器中调用它,但是更好的问题是为什么?
我的问题是containerRegistry.GetContainer()。Resolve()是否是从SimpleIoc.Default.GetInstance()转换的正确方法
如果您要解决IContainerRegistry中的某些问题,因为您需要进行一些疯狂的初始化。我建议您使用DryIoc的内置API之一:
containerRegistry.Register<IFoo, Foo>();
containerRegistry.GetContainer().Register<IBar>(Reuse.Singleton,
Made.Of(() => new BarImplementation("requiredString", Arg.Of<IFoo>()));
您会在这里注意到,我故意忽略了您的Rp1210示例:
// The factory method is necessary to prevent the linker from removing the class A constructor
SimpleIoc.Default.Register<IClassC>(() => new Rp1210(SimpleIoc.Default.GetInstance<IClassA>(), SimpleIoc.Default.GetInstance<IClassB>()));
有两个原因我忽略了这个原因...
您会注意到,我仅引用该特定于Container的API,因为它具有我需要注入的原始值。