【问题标题】:Ninject - how to reference a parent object from an injected child objectNinject - 如何从注入的子对象中引用父对象
【发布时间】:2012-11-13 17:43:34
【问题描述】:

我正在尝试使用 Ninject 组成一个对象图,其中父对象包含一个子对象,并且子对象还维护对其父对象的引用。

如果没有依赖注入,它看起来像这样:

public interface IParent { }
public interface IChild { }

public class Parent : IParent
{
    public Parent()
    {
        Child = new Child(this);
    }

    public IChild Child { get; private set; }       
}

public class Child : IChild
{
    public Child(IParent parent)
    {
        Parent = parent;
    }

    public IParent Parent { get; private set; }
}

我希望能够配置 Ninject 绑定来支持这种关系,这样IParent 的多个实例可以在瞬态范围内实例化,每个实例都会自动填充一个包含循环引用的IChild 实例给它。

我已经阅读了建议 Ninject 可以支持循环关系的 cmets,但我无法得出一个有效的配置。

有什么建议吗?

谢谢,

蒂姆。

【问题讨论】:

  • 好吧,至少我试过了……但我也没有成功,这个话题的资源并不多。这是因为你首先不应该有循环依赖。您可能应该考虑使用不同的设计。
  • @Viktor - 是的,我也对循环引用感到不舒服,但我还没有找到任何其他可以满足我需要的设计。无论如何,我已经找到了一个合理的解决方法(在下面发布)。看看其他人是否发布了真正的解决方案将会很有趣。

标签: ninject circular-dependency circular-reference


【解决方案1】:

如果其他人遇到这个问题,这是我使用的解决方案(尽管我接受可能存在更好的解决方案):

public interface IParent { }

public interface IChild
{
    IParent Parent { get; set; }
}

public class Parent : IParent, IInitializable
{
    public Parent(IChild child)
    {
        Child = child;
    }

    public IChild Child { get; private set; }

    public void Initialize()
    {
        Child.Parent = this;
    }
}

public class Child : IChild
{
    public IParent Parent { get; set; }
}

关键是要在父类中实现Ninject的IInitializable接口,让它在合成完成后接收回调。在此回调处理程序中,父实例简单地为子对象分配对this 的引用。

【讨论】:

  • 在这里聚会很晚,但如果其他人在这里绊倒,那么有一个解决方案加上工作代码on this page
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多