c# - Ninject:将父实例提供给正在解析的子实例

标签 c# dependency-injection scope 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>();
    }
}

当我运行这段代码时,我有一个异常,因为我有一个循环依赖。 SR类需要注入(inject)IFI实例才能完成,FI类需要注入(inject)ISR实例。

当然,使用属性注入(inject)并不能解决这个问题。

但我有一个特殊性:我需要先构造 ISR,并且必须将此实例提供给 FI。因此 ISR 和 IFI 需要共享一个范围。

您将如何使用 Ninject 解决这个问题?

最佳答案

处理此问题的最佳方法是重构您的设计以消除循环依赖性。几乎所有的循环依赖都可以通过适当的设计来消除。如果您有循环依赖关系,通常存在设计缺陷。您很可能没有履行单一职责原则。

否则你必须进行两种方式的属性注入(inject)并确保它们具有相同的范围。例如。来自 NamedScope 扩展的 InCallScope。参见 http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

关于c# - Ninject:将父实例提供给正在解析的子实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6180280/

相关文章:

javascript - 中级 JavaScript 程序员编写更好代码的技巧

c# - 从字符串中删除 HTML 标签,包括 C# 中的 &nbsp

c# - 使用 Kentico API 9 创建多元文化产品

javascript 无法读取 null 的属性 'style'

javascript - angular - 为模块提供不同的服务

javascript - 如何在 .then() 链中访问之前的 promise 结果?

C#:Cdecl DllExport,参数中带有指向类实例的指针

iOS Typhoon DI 框架替代 objective-c 中的单例

go - 使用依赖注入(inject)测试包装函数

c# - 委托(delegate)中变量的范围