Dependency Injection을 사용하면 객체 지향 코드를 작성하는 방식이 바뀌고 있습니다. 예를 들어, 아래 나는 것 DI 내 코드 구조를 사용하여 DI의존성 주입은 OOP에 반대합니까?
없이Interface: DataAdapter
SqliteDataAdapter implements DataAdapter
XMLDataAdapter implements DataAdapter
OracleDataAdapter implements DataAdapter
// Initialization
DataAdapter adapter = new SqliteDataAdapter();
DataAdapter adapter = new XMLDataAdapter();
DataAdapter adapter = new OracleDataAdapter();
만 할 것이 무엇인가 :
이 변경에 대한 이유는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();
입니다 내 모듈의 I 수 바인드 한 인터페이스 ~ 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 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
:
여기
@inject protected ISqliteDataAdapter dataAdapter;
내가 단지 1 인터페이스를 갖는 그것을 할 방법입니다
제가 이해하려고하는 것은 어떻게 대구를 구조화 할 수 있습니까? 내가 DataAdapter의 모든 유형에 대한 인터페이스를 갖지 않고 주입하는 객체의 유형을 제어 할 수있는 방식으로.
[IoC를 사용할 때 인터페이스 추상화에 대해 혼란 스러울 수 있습니다.] (http://stackoverflow.com/questions/5144622/im-confused-about-interface-abstractions-when-using-ioc) –
그 스레드를 이미 읽고, 내 질문에 대답하지 않습니다. – aryaxt
왜 안 되니? 1 : 1 인터페이스가 가장 좋은 방향이 아니라는 것은 꽤 분명합니다. 따라서 DI는 인터페이스 사용의 전체 목적을 변경하지 않습니다. 두 번째 예제에서와 같이 코드를 구조화하려는 이유가 무엇입니까? 각각의'adapter' 변수를'DataAdapter'로 선언 할 수없는 이유는 무엇입니까? 세 가지 새로운 인터페이스가 추가로 얻게 된 가치는 무엇입니까? –