WPF Prism为什么选择RegisterType?(带容器)

Zap*_*ila 4 wpf prism ioc-container unity-container

根据我的理解,棱镜的统一容器可以解决类型事件,如果它们尚未注册,这是否使_container.RegisterType有点无用?

谢谢!

Tim*_*oyd 5

如果我正确理解你的问题,你所看到的是Unity可以(尝试)直接创建类的实例,这与解析类型不同.要求Unity"直接"创建类是完全合理的,但是,为了利用"控制反转",您通常会要求容器解析一个接口,您已经通过该接口将接口映射到类RegisterType.这样,您可以将类的不同实现映射到接口,而无需更改代码,即"控制反转"和"基于接口的编程".

这个过程涉及到您要求解析一个接口,然后Prism找到绑定到界面的内容即解决方案,然后为您创建一个实例,即工厂功能.Unity的工厂功能将确保解析生成已解析类的实例所需的任何其他依赖项,例如在类构造函数参数上使用依赖项注入.整个过程是递归的,直到解决了所有依赖关系.

例如

如果你要求IFoo并且它受到约束Foo,Unity将尝试制作一个实例Foo.如果Foo有一个构造函数IBar,它将尝试解析IBar并创建一个在构造函数中使用的实例IFoo.

所以在下面的代码中:

我们可以IFoo如上所述解决.

我们可以Bar直接创建一个类的实例,因为它没有依赖关系.

我们可以Foo直接创建一个类的实例,因为它依赖于IFoo,但我们已经注册了它.

我们不能Woo直接制作一个实例,因为没有注册IYay.

//Types
public interface IBar{}
public class Bar : IBar {}

public interface IFoo{}
public class Foo : IFoo{ public Foo(IBar bar) {} }

public interface IYay{}
public class Woo { Woo(IYay yay){} }

//Registrations
container.RegisterType<IFoo, Foo>();
container.RegisterType<IBar, Bar>();

//Resolve IFoo
IFoo foo = container.Resolve<IFoo>();

//Create Bar directly
Bar bar = container.Resolve<Bar>();

//Create Foo directly
Foo foo = container.Resolve<Foo>();

//Create Woo directly - won't work as IYay is not registered!
Yay yay = container.Reolve<Yay>();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,RegisterType用于将具体实现映射到接口.在这一点上,我们可以映射我们想要的任何实现,只要容器始终用于解析类型,这将在整个程序中产生影响.

例如,如果我们更改IBar映射到的内容,那么任何时候IFoo都会被解析,它将使用不同的实现来创建IBar.这为我们提供了一种通过改变单行代码来改变程序行为的实质方法,即RegisterType.