例如,我有以下对象图:
new Root(
new Branch(),
new BranchWithLeafs(
new Leaf()
)
);
我们可以Leaf
我可以确定使用context dependent injection的Leaf
的父母,但我如何获得Root
?
答案 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