我在这里阅读http://en.wikipedia.org/wiki/Dependency_injection,我很难弄清楚谁是谁在这个过程中。在依赖注入中,谁是客户端和注入器和服务?
如果我有一个插件,我是客户吗?谁在做各种注射方法?
编辑:增加了服务。
我在这里阅读http://en.wikipedia.org/wiki/Dependency_injection,我很难弄清楚谁是谁在这个过程中。在依赖注入中,谁是客户端和注入器和服务?
如果我有一个插件,我是客户吗?谁在做各种注射方法?
编辑:增加了服务。
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);
}
}
好的,是吗?
但你写了一些新的记录器,并希望使用它...怎么样? 你应该改变梅勒这个...... 它总是不好的,因为记录不是梅勒类的目的...
DI让我们来限制接口只
Mailer(ILogger logger) { this.logger = logger; }
,或者如果你想切换课后伐木者实例
public setLogger(ILogger logger){ this.logger = logger;}
现在你可以用它实现ILogger接口的所有记录器类...
这是非常灵活的...
愚蠢的问题。客户是“其他”家伙计划,对吗?我以为DI并不要求我在客户端程序中用插件做任何事情。你有没有插件显示我的例子? – johnny
@johnny,我加个例子来回答......你写的是哪种语言?我是PHP开发人员,可以在上面的代码中发现一些错误...查看它,就像伪代码一样... –
梅勒是客户端,记录器是服务和家伙实例化一些记录器,并通过(注入)它给邮件是喷油器) –
希望,这篇文章可能会使一些更清晰:http://www.infoq.com/articles/Succeeding-Dependency-Injection –
插件是服务,在客户端代码中使用/通过DI课... –