ary*_*axt 1 dependency-injection interface
我觉得使用依赖注入正在改变我编写面向对象代码的方式.例如,下面就是我没有DI的情况
Interface: DataAdapter
SqliteDataAdapter implements DataAdapter
XMLDataAdapter implements DataAdapter
OracleDataAdapter implements DataAdapter
// Initialization
DataAdapter adapter = new SqliteDataAdapter();
DataAdapter adapter = new XMLDataAdapter();
DataAdapter adapter = new OracleDataAdapter();
Run Code Online (Sandbox Code Playgroud)
但使用DI我的代码结构将是:
Interface: DataAdapter
SqliteDataAdapter implements ISqliteDataAdapter, DataAdapter
XMLDataAdapter implements IXMLDataAdapter, DataAdapter
OracleDataAdapter implements IOracleDataAdapter, DataAdapter
// Initialization
ISqliteDataAdapter adapter = new SqliteDataAdapter();
IXMLDataAdapter adapter = new XMLDataAdapter();
IOracleDataAdapter adapter = new OracleDataAdapter();
Run Code Online (Sandbox Code Playgroud)
这种改变的原因是在我的模块中我可以将1个接口绑定到1个类.这是一种不好的做法吗?如果是,什么是正确的解决方案?
DI不会改变使用接口的整个目的吗?
编辑: 以下是我对DI容器的绑定
bind(ISqliteDataAdapter.class).to(SqliteDataAdapter.class);
bind(IXMLDataAdapter.class).to(XMLDataAdapter.class);
bind(IOracleDataAdapter.class).to(OracleDataAdapter.class);
Run Code Online (Sandbox Code Playgroud)
如果我按照建议做,我怎么能使用多个适配器?如果我需要在我的应用程序中同时使用XMLDataAdapter和SQLDataAdapter,该怎么办?
bind(DataAdapter.class).to(SqliteDataAdapter.class);
Run Code Online (Sandbox Code Playgroud)
编辑:
这是获取实例的当前调用:
@inject protected ISqliteDataAdapter dataAdapter;
Run Code Online (Sandbox Code Playgroud)
这是我应该如何只使用1个接口:
@inject protected DataAdapter dataAdapter;
// In this case I don't have a choice on which type of data adapter It's going to create
// It's already defined in my module file and it's pointing to one of the 3 DataAdapters
Run Code Online (Sandbox Code Playgroud)
所以我想要了解的是,我如何以一种我可以控制它注入的对象类型的方式构建我的代码,而不需要为每种类型的DataAdapter提供接口.
我会说DI是接口的自然结果.我们有接口的原因是我们可以编写不依赖于特定类的代码,而是编写具有多个类而无需任何更改的代码.即使我们期望只有一个我们需要的课程,这可能会在将来发生变化.通过编程到界面,我们甚至可以解释我们无法想象的变化.
DI只是以一种特殊的方式使用上述概念,以最大限度地提高代码的可测试性和适应性.所以我会说DI是一个非常好的做法.
也就是说,我认为对于涉及这类系统的任何人都会发出一个警告.我们编写像你这样的完整类SqliteDataAdaptor,然后按"提取界面"按钮给出ISqliteDataAdaptor界面是危险的.这种做法非常糟糕,特别是如果它发生了很多.相反,ISqliteDataAdaptor通常应首先设计,然后可以编写合理的实现.
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |