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

时间:2011-10-23 13:53:13

标签: wpf unity-container prism ioc-container

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

谢谢!

1 个答案:

答案 0 :(得分:5)

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

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

例如

如果您要求RegisterType并且绑定IFoo,Unity将尝试创建Foo的实例。如果Foo的构造函数带有Foo,Unity将尝试解析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>(); 用于将具体实现映射到接口。在这一点上,我们可以映射我们想要的任何实现,只要容器始终用于解析类型,这将在整个程序中产生影响。

例如,如果我们更改RegisterType映射到的内容,那么只要IBar已解决,就会使用IFoo的不同实现创建它。这为我们提供了一种通过改变单行代码即IBar来改变程序行为的实质方法。

相关问题