Dependency injection Ninject依赖项注入作用域

Dependency injection Ninject依赖项注入作用域,dependency-injection,ninject,Dependency Injection,Ninject,我正试图用Ninject将依赖项注入到继承权中,我对延迟注入的作用域有一个疑问。我有一个基本的层次结构,包含一个家长和一个孩子。孩子被注射到父母体内,他们都被注射了“盾形纹章”属性: public class Parent { [Inject] public Child Child { get; set; } [Inject] public CoatOfArms CoatOfArms { get; set; } } public class Child {

我正试图用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:

public class FamilyModule : NinjectModule
{
    public override void Load()
    {
        Bind<Parent>().ToSelf();
        Bind<Child>().ToSelf();
        Bind<CoatOfArms>().ToSelf().InScope(ctx =>
        {
            var request = ctx.Request;
            if (typeof(Parent).IsAssignableFrom(request.Service))
                return request;
            while ((request = request.ParentRequest) != null)
                if (typeof(Parent).IsAssignableFrom(request.Service))
                    return request;
            return new object();
        });
    }
}
这会中断,因为这是一个全新的请求,请求树上的漫游会随着该请求而停止。我可以手动将CoatFarms作为属性传递,但是我必须记住在试图创建子对象的代码中的其他地方都要这样做。此外,子类可能有自己的子类和子类等,因此我将不得不再次手动传递层次结构链中的所有参数,从而失去依赖项注入作用域的所有好处


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

使用ninject.extensions.contextpreservation(,作为nuget package提供),然后进行更改

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

这需要:(也可以作为nuget软件包提供)

编辑:您可能还需要将
IKernel
更改为
IResolutionRoot
以进行解析

public void InjectChild()
{
    this.Child = this.Kernel.Get<Child>();
}
public void InjectChild()
{
    this.Child = this.Kernel.ContextPreservingGet<Child>();
}
public override void Load()
{
    Bind<Parent>().ToSelf().DefinesNamedScope(FamilyScopeName);
    Bind<Child>().ToSelf();
    Bind<CoatOfArms>().ToSelf().InNamedScope(FamilyScopeName);
}