这份原稿.micro, Bootstrapper和CompositionRoot

本文关键字:Bootstrapper CompositionRoot micro | 更新日期: 2023-09-27 18:06:55

我想了解CompositionRoot是关于什么的。

到目前为止,我还没有找到一个深刻的描述它是关于什么的,只简短地说明什么是不能做的。

是在利用calibre时出现的Bootstrapper。"CompositionRoot"是什么意思?

或者它更接近servicelocator反模式,因为它只能交付程序集中的任何东西及其依赖项。

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

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

让我们假设我所有的viewmodel都注入了EventAggregator(构造函数注入)。现在我想在需要的时候动态地创建那些viewmodel。我可以预先注册类型(在CompositionRoot中),但是以后如何解决依赖关系呢?据我所知,容器不应该在组合根之后被触摸。当然,我不希望在需要实例之前创建所有实例(这会使应用程序启动缓慢)。这里指的是"注册-解决-发布"吗?(该模式也是ploeh博客中创造的)

这份原稿.micro, Bootstrapper和CompositionRoot

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

如其所述:

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

这应该是:

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

在Caliburn的例子中。Micro, Bootstrapper类为您提供了一个ConfigureContainer方法来覆盖和组合您的模块。

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

这份原稿。Micro将通过你的容器解析你的shell视图模型(如果你使用Bootstrapper的通用版本)。

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

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

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

  1. 将对容器的引用作为工厂类型的依赖传递给
  2. 在工厂中使用服务定位器模式(例如Caliburn)。微IoC类)
  3. 一些IoC容器,如Castle Windsor和(使用扩展)Ninject将根据工厂接口和约定为您生成工厂类型(这是最好的选择)