简单注入器:获取图的根

时间:2014-03-10 20:13:07

标签: c# dependency-injection tree simple-injector

例如,我有以下对象图:

new Root(
   new Branch(),
   new BranchWithLeafs(
      new Leaf()
   )
);

我们可以Leaf我可以确定使用context dependent injectionLeaf的父母,但我如何获得Root

1 个答案:

答案 0 :(得分:2)

RegisterWithContext扩展方法在后台使用ExpressionBuilding事件,并拦截Expression父项的Leaf对象,并更改{{1}的调用}委托,以便传递Leaf

扩展代码以允许父母的父母(在您的情况下为DependencyContext)也很容易被截获,但不幸的是,当您使用长于{的生活方式注册服务时,这会很快中断{1}}。这是由Simple Injector在封面下进行的优化引起的。例如,当您将Root注册为单例时,其值将在Transient表达式创建之前创建,这意味着此时没有表达式树可以在{{1}后更改建成。因此,在这种情况下,Branch只取决于Root,其中包含对Root实例的引用,并且您无法更改Root的创建。我认为这是Simple Injector对您起作用的这些优化的少数场景之一。

以下是Expression.Constant扩展方法的更改版本,允许“乌龟一直向下”处理,但请记住,一旦您在树中注册了与生活方式不同的任何内容,链条就会被截断Branch

Leaf