2014-03-27 35 views

回答

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); 
    } 
} 

好的,是吗?

但你写了一些新的记录器,并希望使用它...怎么样? 你应该改变梅勒这个...... 它总是不好的,因为记录不是梅勒类的目的...

DI让我们来限制接口只

Mailer(ILogger logger) { this.logger = logger; } 

,或者如果你想切换课后伐木者实例

public setLogger(ILogger logger){ this.logger = logger;} 

现在你可以用它实现ILogger接口的所有记录器类...

这是非常灵活的...

+0

愚蠢的问题。客户是“其他”家伙计划,对吗?我以为DI并不要求我在客户端程序中用插件做任何事情。你有没有插件显示我的例子? – johnny

+0

@johnny,我加个例子来回答......你写的是哪种语言?我是PHP开发人员,可以在上面的代码中发现一些错误...查看它,就像伪代码一样... –

+1

梅勒是客户端,记录器是服务和家伙实例化一些记录器,并通过(注入)它给邮件是喷油器) –