Доступ к внешнему источнику из реализации DAO - PullRequest
0 голосов
/ 12 января 2012

Рассмотрим следующий простой пример DAO:

public abstract class DAOFactory
{
    public abstract AccountDAO getAccountDAO();
    public abstract MessageDAO getMessageDAO();

    public static DAOFactory getDAOFactory(int whichFactory)
    {
        // depending on whichFactory
        return new SpecificDAOFactory();
    }
}

public interface AccountDAO
{
    public void add(Account account);
    public void delete(Account account);

    public int authenticate(Account account); // another source!
}

public interface MessageDAO
{
    //other methods
}

Все вышеупомянутые методы должны быть реализованы с использованием одного и того же источника данных, за исключением AccountDAO.authenticate ().

Информация аутентификации доступна в другом источнике данных и должна быть подключаемой по очереди (например, может быть SQL, LDAP и т. Д.). В то же время источник данных аутентификации не зависит от источника данных DAO, то есть который может быть A, B или C, а источник аутентификации X или Y.

С точки зрения дизайна интерфейса аутентификация хорошо вписывается в AccountDAO. Но с точки зрения реализации я чувствую себя некомфортно.

Какой будет лучший дизайн, который обеспечит понятный интерфейс и реализацию уровня доступа к данным?

1 Ответ

1 голос
/ 12 января 2012

Объекты доступа к данным имеют тенденцию следовать той же структуре и шаблону, поэтому вы можете рассмотреть возможность создания класса более высокого уровня, инкапсулирующего эту общую логику.Я выделю на примере, пожалуйста, обратите внимание, что я опускаю интерфейсы, потому что я редко нахожу их полезными на уровне DAO.

Базовый класс DAO :

public class BaseDAO<T> {
    private Class<T> clazz;

    public BaseDAO(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    public T find(Long id) { ... }

    public List<T> findAll() { ... }

    public T create(T entity) { ... }

    public T update(T entity) { ... }

    public void delete(T entity) { ... }
}

Производный DAO для гипотетического объекта Account

public class AccountDAO extends BaseDAO<Account> {
    public AccountDAO() {
        super(Account.class);
    }

    public List<Account> findByAccountStatus(String status) { ... }
}

As youвидите, вы значительно минимизируете объем кода в производных DAO.С этой настройкой вам не нужно использовать фабрику, просто инициализируйте ваши DAO напрямую.

Что касается вашего второго вопроса, я бы не стал размещать метод аутентификации в учетной записи DAO.С аутентификацией следует обращаться на более высоком уровне абстракции (очень хорошо вписывается в уровень обслуживания), даже если она в конечном итоге получает некоторую информацию из уровня доступа к данным.

...