什么是SimpleIoc.Default.GetInstance的MVVM Prism转换?

时间:2019-02-22 00:06:17

标签: c# mvvm containers prism mvvm-light

我对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 >()));

1 个答案:

答案 0 :(得分:1)

所以您似乎在这里有两个问题,所以我将尝试回答每个部分:

从SimpleIoc转换为IContainerRegistry

  

在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>()));

有两个原因我忽略了这个原因...

  1. 此评论告诉我为什么他们要这样做。关闭链接,或更新链接器配置以为IClassA实现保留ctor。
  2. 使用IoC容器的全部目的是它会自动了解它需要注入已注册的服务。

您会注意到,我仅引用该特定于Container的API,因为它具有我需要注入的原始值。