2009-08-18 3 views
0

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

Поскольку все, что мне нужно для результатов поиска, это несколько свойств - например, «имя» и «id» - I может просто запрашивать базовую базу данных, но я не хочу обходить репозиторий, так как это будет отрицать большую ценность.

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

Я знаком с шаблоном прокси для ленивых объектов. Но как это делают большие мальчики? Есть ли устоявшееся решение этой проблемы?

ответ

1

Если вы идете строго DDD, я думаю, что ваши поиски должны возвращать полностью заполненные объекты. Но иногда вам приходится изгибать правила.

Я могу вам сказать, что не нужно делать:

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

  2. Не сворачивайте свою ленивую схему инициализации. Это сложно и подвержено ошибкам. Я сделал это один раз, и я могу смело сказать, что это не стоило усилий.

Итак, что остается? Мое голосование - захватить нужные вам данные и создать класс, который имеет только поля, которые вы планируете заполнить, и вернуть их список. Теперь любой, кто вызывает вашу функцию поиска, точно знает, что они получают: подмножество фактических данных. Когда вам нужна полная сущность, вам придется снова ударить по базе данных.

Вот пример того, что я имею в виду в Java:

public class CakeRepository { 
    public List<CakeProjection> getCakesByManufacturer(String manufacturer); 

    public Cake getCake(long id); 

    ... 
} 

public class CakeProjection { 
    private long id; 
    private String cakeName; 

    ... 
} 
+0

Да, да, да, все имеет смысл. Большое спасибо. Теперь мне просто нужно придумать имя для этих частичных объектов. «Проецирование», да ...? – Metaphile

0

Вы определяете запросы в интерфейсе репозитория, которые отбрасывают данные, которые вы после.

Я думаю, что большие мальчики используют слой ORM (например, Hibernate) и передают определенный запрос ORM.

+0

Таким образом, если запрос указывает, что я заинтересован только в именах и идентификаторах, мое хранилище может возвращать множество объектов с большинством их свойств установить значение NULL? – Metaphile

+0

принятый ответ кажется мне хорошим. – mcintyre321