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

问题描述 投票:0回答:1

我是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 >()));
c# mvvm containers prism mvvm-light
1个回答
1
投票

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

从SimpleIoc转换为IContainerRegistry

我在MVVM Light中注册了以下代码行,我怀疑这是否是在MVVM Prims的DryIOC中转换它的正确方法。

Prism的IContainerRegistry是一个围绕容器的抽象层,旨在保持绝大多数注册的一致性,无论你使用哪个DI容器与Prism。这也使得更容易添加对不同容器的支持,因为Prism已经概述了我们期望Container能够支持的接口。

例如,你有:

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,因为它有一个我需要注入的原始值。

© www.soinside.com 2019 - 2024. All rights reserved.