我在这里读书,http://en.wikipedia.org/wiki/Dependency_injection,我很难弄清楚谁在这个过程中。
如果我有插件,我是客户吗?谁通过各种方式进行注射?
编辑:增加了服务。
答案 0 :(得分:1)
DI用于更多抽象......
//Service
Plugin mySuperPlugin = new MySuperPlugin();
//Injecting constructor style
Client client = new Client(mySuperPlugin);
或setter风格:
Client client = new Client();
client->loadPlugin(mySuperPlugin);
而不是
public class Client {
private Plugin plugin;
Client() {
this.plugin = new MySuperPlugin();
}
}
我们不应该硬编码实现中的任何具体类......
<强> UPD:强>
当我们需要添加依赖时,DI总是需要。
例如:
让我们的代码:
public class Mailer {
private FileLogger logger;
Mailer() {
this.logger = new FileLogger();
}
public void send(String email, Srting text) {
//send email
this.logger.log(email, text);
}
}
好的,是吗?
但你写了一些新的Logger并希望使用它......怎么样? 你应该为此改变梅勒... 它总是很糟糕,因为记录器不是Mailer类的目标......
DI允许我们仅限制界面
Mailer(ILogger logger) { this.logger = logger; }
或者如果你想要在类实例化之后切换记录器
public setLogger(ILogger logger){ this.logger = logger;}
现在您可以使用所有实现ILogger接口的记录器类...
它非常灵活......