2012-11-26 112 views
2

我想用Ninject来编写一个对象图,其中父对象包含一个子对象,并且子对象也维护对其父对象的引用。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可以支持循环关系,但是我还没有能够达到工作配置。

有什么建议吗?

谢谢,

Tim。

+0

至少我试过......我没有成功,也没有很多reasources到这个主题。这是因为你首先不应该有循环依赖。你应该考虑使用不同的设计。 –

+0

@Viktor - 是的,我也对循环引用感到不舒服,但我还没有找到任何其他可以做我需要的设计。无论如何,我已经找到了一个合理的解决方法(下面发布)。看看其他人是否发布了真正的解决方案将是有趣的。 –

回答

3

万一别人运行到这个问题,这里是我使用的解决方案(虽然我承认有可能存在更好的):

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的引用。

+0

这里的派对非常晚,但如果有人在这里绊倒,那么有一个解决方案和工作代码[在这个页面上](http://www.emidee.net/index.php/2010/08/23/ninject-use - 酮数据库会话每次观看模型/)。 –