2014-02-24 113 views
0

我正在尝试将依赖关系注入到Ninject的过渡注入中,并且我有一个关于延迟注入范围的问题。我有一个包含父母和孩子的基本分层结构。孩子被注入到母公司,他们都获得了财产“的徽章”注入:Ninject依赖注入范围界定

public class Parent 
{ 
    [Inject] 
    public Child Child { get; set; } 

    [Inject] 
    public CoatOfArms CoatOfArms { get; set; } 
} 

public class Child 
{ 
    [Inject] 
    public CoatOfArms CoatOfArms { get; set; } 
} 

public class CoatOfArms 
{ 
} 

因为他们是在同一个家庭,他们应该都得到武器的外套一样,所以我成立我绑定范围他们在父请求CoastOfArms:

​​

这一切工作正常,但让我们说,我想稍微改变它,这样孩子以后注入,母公司已经注入后良好。我消除对儿童财产Inject属性,注入内核并使用它来注入孩子的方法:

[Inject] 
    public IKernel Kernel { get; set; } 

    public Child Child { get; set; } 

    public void InjectChild() 
    { 
     this.Child = this.Kernel.Get<Child>(); 
    } 

这打破了,因为它是一个完全新的要求和步行请求树停止与该请求。我可以手动将CoatOfArms作为属性传递,但是我必须记住在尝试创建子对象的代码中的其他任何地方执行此操作。此外,子类可能有自己的子孙,所以我将不得不手动将参数全部向下传递给层次链,从而失去了依赖注入范围的所有好处。

有没有办法创建我的子对象,并以某种方式将请求链接到父请求,以便作用域的工作方式就像该子对象已经与父对象同时注入一样?

回答

0

使用ninject.extensions.contextpreservation(https://github.com/ninject/ninject.extensions.contextpreservation/wiki,可作为NuGet包),然后改变

public void InjectChild() 
{ 
    this.Child = this.Kernel.Get<Child>(); 
} 

public void InjectChild() 
{ 
    this.Child = this.Kernel.ContextPreservingGet<Child>(); 
} 

(所述.ContextPreservingGet<Child>()是一个扩展并且因此可能需要一个using Some.Name.Space;是识别)。

顺便问一下,你也可以改变你的自定义的范围界定为以下内容: 公共类FamilyModule:NinjectModule { 私人常量字符串FamilyScopeName =“FamilyScopeName”;

public override void Load() 
{ 
    Bind<Parent>().ToSelf().DefinesNamedScope(FamilyScopeName); 
    Bind<Child>().ToSelf(); 
    Bind<CoatOfArms>().ToSelf().InNamedScope(FamilyScopeName); 
} 

}

这就要求:https://github.com/ninject/ninject.extensions.namedscope(也可作为NuGet包)

编辑:您可能还需要从IKernel更改为IResolutionRoot解决。