Ninject:将父实例提供给要解析的孩子

问题描述

| 我有这个类的层次结构:
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>();
    }
}
当我运行此代码时,我有一个异常,因为我有一个循环依赖性。 SR类需要注入IFI实例才能完成,FI类需要注入ISR实例。 当然,使用属性注入无法解决此问题。 但是我有一个特殊性:我需要首先构造ISR,并且必须将此实例赋予FI。因此,ISR和IFI需要共享一个范围。 您将如何使用Ninject解决这个问题?     

解决方法

        解决此问题的最佳方法是重构设计以消除循环依赖性。适当的设计几乎可以消除所有循环依赖性。如果您具有循环依赖性,通常会有设计缺陷。您很可能不符合“单一责任原则”。 否则,您必须进行两种属性注入,并确保它们具有相同的作用域。例如。来自NamedScope扩展的InCallScope。参见http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...