在依赖注入中,谁是客户端,注入和服务?

时间:2014-03-27 15:59:42

标签: dependency-injection

我在这里读书,http://en.wikipedia.org/wiki/Dependency_injection,我很难弄清楚谁在这个过程中。

如果我有插件,我是客户吗?谁通过各种方式进行注射?

编辑:增加了服务。

1 个答案:

答案 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总是需要。

例如:

  • 我们有一些做任何事情的班级,例如发送邮件
  • 我们要记录所有这些集体诉讼
  • 我们为此
  • 设置了聪明的类FileLogger

让我们的代码:

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接口的记录器类...

它非常灵活......