Мне кажется, что использование Dependency Injection меняет способ написания моего объектно-ориентированного кода.Например, ниже то, что я сделал бы без 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();
, но используя 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();
Причина этого изменения в том, что в моем модуле я могу привязать 1 интерфейс к 1 классу .Это плохая практика?Если да, каково правильное решение?
Разве DI не меняет цели использования интерфейсов?
РЕДАКТИРОВАТЬ: Ниже приведена моя привязка для контейнера DI
bind(ISqliteDataAdapter.class).to(SqliteDataAdapter.class);
bind(IXMLDataAdapter.class).to(XMLDataAdapter.class);
bind(IOracleDataAdapter.class).to(OracleDataAdapter.class);
Если я сделаю, как предложено, как я смогу использовать несколько адаптеров?Что, если мне нужно использовать и XMLDataAdapter, и SQLDataAdapter в моем приложении?
bind(DataAdapter.class).to(SqliteDataAdapter.class);
Редактировать:
Вот текущий вызов для получения экземпляра:
@inject protected ISqliteDataAdapter dataAdapter;
Вот как я должен это сделать, имея только 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
Итак, я пытаюсь понять, как я могу структурировать свой код так, как у меня естьконтроль над типом объекта, который он вводит, без интерфейса для каждого типа DataAdapter.