При реализации шаблона DAO в Java, как должны быть реализованы и использованы TransferObjects?

Я реализую шаблон DAO, как указано в Основные шаблоны J2EE. В моем проекте у меня есть 3 модуля: core layer, который использует DAO-API layer, который реализован моим Поставщик услуг DAO-MySQL layer.

У меня есть вопросы по дизайну и использованию TransferObjects:

1a) Нормально ли, что классы TransferObject сильно избыточны по сравнению с эквивалентными им классами "бизнес-уровня", или классы "бизнес-уровня" являются TransferObject?

Например, если в моем core layer у меня есть класс:

public class Customer {
    private int id;
    private String lname;
    ...
    //various methods here, plus getters/setters
}

В DAO-API layer у меня будет:

public class CustomerTO implements Serializable {
    private int id;
    private String lname;
    ....
    //getters/setters here
}

Я ненавижу эту избыточность между Customer и CustomerTO. Кроме того, в «Примере 9.5 Объект передачи клиента» Основные шаблоны J2EE , похоже, это только один класс Customer, который является TransferObject.

Я также вижу преимущество в том, что наличие двух классов позволяет моему DAO-API layer быть полностью независимым от core layer и предоставляться как отдельный модуль, о котором конечные пользователи даже не узнают.

=> 1b) Но, может быть, мое DAO-API layer должно быть частью моего core layer, а Customer быть TransferObject?

=> 1c) Или я что-то упускаю, чтобы избежать избыточности между основным классом бизнес-уровня и его объектом передачи?



2) Можно ли не использовать TransferObject в качестве параметров при вызове методов DAO? Например:

public interface CustomerDAO {
    public Collection<CustomerTO> getCustomersByNameAndCity(String name, String city);
}

Или я всегда должен использовать что-то вроде:

public interface CustomerDAO {
    public Collection<CustomerTO> getCustomersByNameAndCity(CustomerTO to);
}

Каковы недостатки использования первого метода?


person FBB    schedule 10.07.2013    source источник


Ответы (1)


1a) Нормально ли иметь TransferObject? Да, это нормально в сценариях, когда вы не пытаетесь ограничить информацию в DTO для отправки. Объект передачи данных — это объект, который используется для инкапсуляции данных и отправки их из одной подсистемы. приложения к другому.

1b) Но, может быть, мой уровень DAO-API должен быть частью моего основного уровня, а Customer должен быть TransferObject? Нет, уровень DAO предназначен для скрытия/инкапсуляции базовых деталей данных в базе данных. DAO используются другими подсистемами для получения данных из источника данных независимо от того, как они хранятся/извлекаются. Основная цель DAO — предоставить простые API для выполнения CRUD данных.

1c) Или я что-то упускаю, чтобы избежать избыточности между основным классом бизнес-уровня и его объектом передачи? Если ваши DTO не ограничивают какую-либо информацию, вы можете использовать тот же класс из бизнес-уровня. Но это может вызвать проблемы в будущих улучшениях, когда вам придется ограничить информацию.

2) Законно ли не использовать TransferObjects в качестве параметров при вызове методов DAO? Например, никто не может запретить вам это делать. Но иногда атрибуты DTO и атрибуты DAO не могут быть легко переведены друг в друга. Так что вам придется добавить дополнительную логику для него. Об этом должен позаботиться человек посередине, ваш деловой слой.

person Juned Ahsan    schedule 10.07.2013
comment
Если ваши DTO не ограничивают какую-либо информацию, вы можете использовать тот же класс из бизнес-уровня. Но это может вызвать проблемы в будущих улучшениях, когда вам придется ограничить информацию. =› в каких ситуациях я бы хотел, чтобы DTO ограничивали некоторую информацию? Я не вижу никакого варианта использования. Кроме того, какое наиболее распространенное решение принято: дублировать DTO или напрямую использовать класс бизнес-уровня? - person FBB; 10.07.2013