2011-11-08 9 views
5

Po raz pierwszy używam wzoru DAO. Z tego co mam do tej pory, read, wdrożenie tego wzorca pomoże mi oddzielić mój kod wywołujący (kontroler) od dowolnej implementacji trwałości - dokładnie tego, czego chcę; to znaczy, nie chcę być ograniczany do korzystania z jakiejś konkretnej bazy danych lub bibliotek zewnętrznych.DAO i zastrzyk zależności, porady?

Tworzę kod testowy (w stylu TDD) używając MongoDB i morfiny (jako przykładu), z klasą morphiny pod warunkiem BasicDAO.

O ile mi wiadomo, rozszerzenie BasicDAO<T, V> wymaga konstruktora akceptującego obiekty Morphia i Mongo; są to bardzo specyficzne (zewnętrzne) typy, których naprawdę nie chcę używać w ruchu poza klasą DAO.

Jak mogę mieć więcej architektury wtykowej? Mam tu na myśli to, co powinienem rozważyć, aby móc skonfigurować moją aplikację do korzystania z konkretnego DAO z określonymi argumentami konfiguracyjnymi, zewnętrznymi od faktycznego źródła?

Odpowiedz

9

"Wstawiana" warstwa DAO jest zwykle/zawsze oparta na interfejsie DAO. Na przykład, pozwala rozważyć dość ogólny proste:

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

(To jest to, co masz w Morphia's generic DAO)

Następnie można rozwijać różne kilka ogólnych implementacje DAO, gdzie można znaleźć różne pola (odzwierciedlone w parametry konstruktora, settery i pobierające, itp.). Załóżmy JDBC oparte jeden:

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

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

Po generic DAO jest realizowane (na betonowym magazynu danych), coraz DAO betonu byłoby to nie do pomyślenia:

public interface PersonDAO extends GenericDAO<Person, Long> { 

} 

i

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

} 

(BTW, co masz w Morphia's BasicDAO jest implementacją ogólnej DAO dla MongoDB).

Drugą rzeczą w architekturze wtykowej jest wybór konkretnej implementacji DAO. Radziłbym przeczytać rozdział 2 z Apress: Pro Spring 2.5 ("Oddanie wiosny do" Hello World "), aby stopniowo dowiedzieć się o fabrykach i zastrzyku zależności:

+0

+1 za to. Dodałbym, że Guice jest strukturą DI używanie z wielkim sukcesem. –

0

Kilka standardowych frameworków DI to Spring i Guice. Obie te struktury ułatwiają TDD.

1

Wiosna robi DI dla Ciebie za pomocą konfiguracji i jest szeroko stosowana.

1

Witam Nie jestem ekspertem od języka Java. ale próbując dać rozwiązanie.

możesz mieć superklasę, w której występują wszystkie związane z połączeniem rzeczy i każda inna klasa bazowa, w której możesz ją rozszerzyć i używać.

Później każdy przełącznik w twoim DB dla określonych sterowników innych firm, możesz przepisać nadklasę.

Znowu nie jestem ekspertem. Po prostu próbuję tutaj, aby się uczyć. :)