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方法。。。此时,它依赖于记录器。