Ninject:如何将'this'(包含类)注入实例?

时间:2016-09-28 13:56:06

标签: dependency-injection ninject constructor-injection

我是Ninject和DI的新手。

我们假设我有一个班级Caller

public class Caller : ICaller, ICallback {

  private ICommand command;

  public Caller(ICommand command) {
    this.command = command;
  }

  //callback method
  public void OnCommandCompleted() { }

}

Command看起来像这样:

public class Command : ICommand {

  private ICallback Callback { get; set; }

  public Command(ICallback callback) {
    this.Callback = callback;
  }

  public void Execute() {

    //do something
    this.Callback.OnCommandCompleted();

  }

}

该命令应该具有对创建/注入它的类的引用。这样做的适当方法是什么?当然,我可以从构造函数中删除依赖项,而是手动设置它:

public Caller(ICommand command) {
  command.Callback = this;
  this.command = command;
}

但还有另一种方法吗?

编辑:为了澄清我对此设计的意图,我更新了给定的代码。 command获得一个回调作为依赖,在我的情况下是Caller

1 个答案:

答案 0 :(得分:1)

就像那样,它不容易实现。 您可以编写没有C#代码(替换容器)以实现ctor注入方案:

new Caller(new Command(???))

==>由于尚未创建???的引用,因此无法替换Caller

要获得循环引用,您必须执行以下操作:

var command = new Command();
var caller = new Caller(command);
command.InitializeWithCallback(caller);

所以我同意Steven,这看起来非常像糟糕的设计,应该重新调整,因此不需要循环依赖。此外,通常容器不支持这种情况 - 在ctor时间,由于尚未创建引用,因此无法注入引用。

理论上,您可以通过将ICallback代理注入Command并在Caller实例化Caller实例后使用Command.InitializeWithCallback(caller)实例来适应您的ctor注入设计。然而,这引入了通常绝对没有根据的复杂性。在一天结束时,它只是膨胀你的代码,而你也可以介绍library("ggplot2") jpeg(filename="circulo.jpeg",width=400 , height=400) ggplot(mpg, aes(displ, hwy, size = hwy))+geom_point(data=, aes(x=1,y=1), colour="Red", shape=1)+scale_radius(labels=NULL, trans="identity", range=c(165,165), guide=FALSE) dev.off()