Zap*_*ila 4 wpf prism ioc-container unity-container
根据我的理解,棱镜的统一容器可以解决类型事件,如果它们尚未注册,这是否使_container.RegisterType有点无用?
谢谢!
如果我正确理解你的问题,你所看到的是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.
| 归档时间: |
|
| 查看次数: |
3112 次 |
| 最近记录: |