Dependency injection 在依赖注入中,谁是客户机、注入器和服务?
我在这里读过,我很难弄清楚在这个过程中谁是谁 如果我有一个插件,我是客户端吗?谁在用各种方法做注射Dependency injection 在依赖注入中,谁是客户机、注入器和服务?,dependency-injection,Dependency Injection,我在这里读过,我很难弄清楚在这个过程中谁是谁 如果我有一个插件,我是客户端吗?谁在用各种方法做注射 编辑:添加服务。DI用于更多抽象 //Service Plugin mySuperPlugin = new MySuperPlugin(); //Injecting constructor style Client client = new Client(mySuperPlugin); 或setter样式: Client client = new Client(); client->lo
编辑:添加服务。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);
}
}
好吧,是吗
但是你写了一些新的日志并且想用它。。。怎么用?
您应该为此更改邮件发送程序。。。
这总是不好的,因为记录器不是Mailer类的目标
DI只允许我们限制接口
Mailer(ILogger logger) { this.logger = logger; }
或者,如果您想在类实例化后切换记录器
public setLogger(ILogger logger){ this.logger = logger;}
现在您可以使用实现ILogger接口的所有记录器类
它非常灵活…希望本文能让它更清晰一些:plugin是一种服务,通过DI…Dumb问题在客户机代码/类中使用。客户是“其他人”项目,对吗?我认为DI不需要我用插件在客户端程序中做任何事情。你在给我看有插件和没有插件的例子吗?@johnny,我加上例子来回答。。。你在写哪种语言?我是PHP开发人员,可以在上面的代码中犯一些错误。。。看看它,就像在伪代码上一样…Mailer是客户机,logger是服务,guy实例化了一些logger并将其传递(注入)给Mailer是一个很好的答案。谢谢哪一个是依赖的?从某个ILogger实例来看是依赖于Mailer的,当然。Logger对Mailer一无所知,但Mailer应该执行这个->Logger->log方法。。。此时,它依赖于记录器。