Ninject:将父实例提供给正在解决的子项

Emi*_*dee 4 c# scope dependency-injection ninject parent-child

我有这个类层次结构:

public interface ISR { }
public interface ICU { }
public interface IFI { }   

public class CU : ICU { }

public class SR : ISR
{
    public SR(IFI fi)
    {
        FI = fi;
    }

    public IFI FI { get; set; }
}

public class FI : IFI
{
    public FI(ISR sr, ICU cu)
    {
        SR = sr;
        CU = cu;
    }

    public ISR SR { get; set; }
    public ICU CU { get; set; }
}

public class Module : NinjectModule
{
    public override void Load()
    {
        Bind<ISR>().To<SR>();
        Bind<ICU>().To<CU>();
        Bind<IFI>().To<FI>();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var kernel = new StandardKernel(new Module());

        var sr = kernel.Get<ISR>();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我有一个例外,因为我有一个循环依赖.SR类需要注入一个IFI实例才能完成,FI类需要注入一个ISR实例.

当然,使用属性注入并不能解决这个问题.

我有一个特殊性:我需要首先构造ISR,并且必须将此实例赋予FI.所以ISR和IFI需要共享一个范围.

你会如何用Ninject解决这个问题?

Rem*_*oor 5

处理此问题的最佳方法是重构您的设计以消除循环依赖.几乎所有的循环依赖都可以通过适当的设计去除.如果你有循环依赖,通常会有一个设计缺陷.您很可能不履行单一责任原则.

否则,您必须执行双向属性注入并确保它们具有相同的范围.例如来自NamedScope扩展的InCallScope.见http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

  • 什么使得无法修复循环依赖?我会成功阅读@Mark Seemann Book.它有一个很好的章节,关于如何修复循环依赖.其他任何事情只是治疗症状.并且双向属性注入在两个绑定上都使用InCallScope进行了很好的测试. (2认同)