2011-11-08 3 views
5

DAO 패턴을 사용하는 첫 번째 메신저입니다. 지금까지 read에서이 패턴을 구현하면 지속성 구현에서 내 호출 코드 (컨트롤러)를 분리하는 데 도움이됩니다. 즉, 특정 데이터베이스 또는 타사 라이브러리의 사용으로 restrcited되기를 원하지 않습니다.DAO 및 의존성 주입, 조언?

저는 MongoDB와 morphia (예를 들어)를 사용하여 morphia가 제공 한 BasicDAO 클래스를 사용하여 몇 가지 테스트 코드 (TDD 방식)를 만들고 있습니다.

내가 알 수있는 한, BasicDAO<T, V>을 확장하려면 Morphia 및 Mongo 객체를 허용하는 생성자가 필요합니다. 이것들은 DAO 클래스 자체의 바깥쪽에 떠 다니는 것을 원하지 않는 매우 특정한 (제 3 자) 타입이다.

어떻게하면 더 많은 플러그 형 아키텍처가 가능합니까? 이것에 의해, 특정 소스와는 별도의 특정 구성 인수로 특정 DAO를 사용하도록 응용 프로그램을 구성 할 수 있다는 것을 어떻게 확인할 수 있습니까?

답변

9

"플러그 가능한"DAO 레이어는 일반적으로/항상 인터페이스 DAO를 기반으로합니다. 에 반영 (서로 다른 분야를 찾을 수있는

는 그런 다음, 다른 몇 가지 일반적인 DAO 구현을 개발할 수 있습니다 (이것은 당신이 Morphia's generic DAO에있는 것입니다)

public interface GenericDAO <T, K extends Serializable> { 
    List<T> getAll(Class<T> typeClass); 
    T findByKey(Class<T> typeClass, K id); 
    void update(T object); 
    void remove(T object); 
    void insert(T object); 
} 

예를 들어, 아주 일반적인 간단한을 고려 할 수 있습니다 생성자 매개 변수, setter 및 getter 등). 의 가정하자 JDBC 기반의 하나

public interface PersonDAO extends GenericDAO<Person, Long> { 

} 

public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO { 

} 
: 일반 DAO가 (구체적인 데이터 저장소에 대한) 구현되면

public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> { 
    private String db_url; 

    private Connection; 
    private PreparedStatement insert; 
    // etc. 
} 

은, 콘크리트의 DAO를 얻는 것은 더 생각할 필요도 없을 것입니다

(BTW, Morphia's BasicDAO은 MongoDB 용 일반 DAO 구현입니다.)

플러그 가능한 아키텍처에서 두 번째로 중요한 것은 구체적인 DAO 구현을 선택하는 것입니다. Apress: Pro Spring 2.5 (제 2 장 "Hello World")에서 제 2 장을 읽고 공장과 의존성 주입에 대해 점진적으로 배우도록 권합니다.

+0

+1 저는 Guice를 DI 프레임 워크로 추가했습니다. 위대한 성공과 함께 사용. –

0

몇 가지 표준 DI 프레임 워크는 Spring과 Guice입니다. 이 두 프레임 워크 모두 TDD를 용이하게합니다.

1

봄은 구성을 사용하는 DI이며 널리 사용됩니다.

1

안녕하세요 저는 java의 전문가가 아닙니다. 하지만 해결책을 제시하려고합니다.

당신은 모든 연결 관련 일들이 일어나는 수퍼 클래스와 그것을 확장하고 사용할 수있는 다른 기본 클래스를 가질 수 있습니다.

나중에 특정 타사 드라이버에 대한 DB의 스위치를 사용하면 수퍼 클래스를 다시 작성할 수 있습니다.

다시 한 번 전문가입니다. 배울 주위 여기 그냥 노력. :)