根据我的理解,prism的统一容器可以解决类型事件,如果它们尚未注册,这是否使_container.RegisterType有点无用?
谢谢!
答案 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
来改变程序行为的实质方法。