0

我试图了解 CompositionRoot 的含义。

到目前为止,我从未找到关于它是什么的深入描述,只是对不应该做什么的简短陈述。

使用 caliburn.micro 时出现的 Bootstrapper 是否已经意味着“CompositionRoot”?

或者它更接近于 servicelocator 反模式,因为它只能提供程序集内部的任何内容及其依赖项。

如果有人对 CompositionRoot 有很好的描述,请分享。我已经知道 ploeh 博客了。

如果我看到 CompositionRoot 带来更好的架构和/或帮助我解决问题,我仍然愿意购买这本书。但是我知道周围没有足够的信息让我看看它会有什么帮助。

更新

假设我所有的 ViewModel 都注入了​​ EventAggregator(构造函数注入)。现在我想在需要时动态创建这些 ViewModel。我可以预先注册类型(在 CompositionRoot 中),但以后如何解决依赖关系?据我了解,在组合根之后不应该触及容器。毫无疑问,我不想在需要它们之前创建所有实例(这会使应用程序启动缓慢)。“注册-解决-发布”是这里的意思吗?(这种模式也是在 ploeh 博客中创造的)

4

1 回答 1

0

我假设您已经在http://blog.ploeh.dk/2011/07/28/CompositionRoot上看到过 Mark 的文章。

正如它所说:

组合根是模块组合在一起的应用程序中的(最好)唯一位置。

这应该是:

尽可能靠近应用程序的入口点。

对于 Caliburn.Micro,Bootstrapper该类ConfigureContainer为您提供了一种方法来覆盖和组合您的模块。

理想情况下,只有您的组合根会引用您的 IoC 容器。

BootstrapperCaliburn.Micro 将通过您的容器解析您的 shell 视图模型(如果您使用 的通用版本)。

IoC如果您确实需要引用组合根之外的容器,它还提供了一个静态类,该类是服务定位器(反)模式的实现。

更新

如果您希望在组合根之后在运行时通过容器解析类型(例如,如果您有复杂的依赖链),请使用工厂类型。

这些工厂类型也将引用您的 IoC 容器。您可以:

  1. 将对容器的引用作为对工厂类型的依赖项传递
  2. 在您的工厂中使用服务定位器模式(例如 Caliburn.MicroIoC类)
  3. 一些 IoC 容器,例如 Castle Windsor 和(使用扩展)Ninject 将根据工厂接口和约定为您生成工厂类型(这是最好的选择)
于 2013-04-02T11:51:00.833 回答