我是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
。
答案 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()
。