Я только изучаю DDD (книга Эрика Эванса передо мной открыта), и я столкнулся с проблемой, на которую я не могу найти ответ. Что вы делаете в DDD, когда вы просто пытаетесь получить простой список записей поиска?
Ex.
EmployeeID: 123
Имя сотрудника: Джон Доу
Штат: Аляска (раскрывающийся список)
Округ: Василла (раскрывающийся список - будет отфильтрован по штатам).
Например, допустим, у вас есть объект домена Employee, интерфейс IEmployeeRepository и класс EmployeeRepository. Это будет использоваться пользовательским интерфейсом для отображения списка сотрудников и индивидуальных данных. В пользовательском интерфейсе вы хотите использовать раскрывающийся список для штата и округа, где живет сотрудник. Доступные округа будут отфильтрованы в зависимости от того, какое государство было выбрано.
К сожалению, таблицы базы данных и пользовательский интерфейс выглядят очень по-разному. В tblEmployees он содержит код штата = AK и код округа = 02130, а не названия штатов и округов.
Старый способ (до того, как я начал этот квест DDD) был бы довольно простым, просто создайте 2 запроса и используйте DataReader для заполнения раскрывающихся списков. Под отображением в раскрывающихся списках находится значение, которое автоматически используется в сообщениях формы.
Однако с DDD я не уверен, как ты должен это делать. Сначала я создал объекты State и County, а также репозитории и интерфейсы для репозиториев. Тем не менее, написание 4 классов + 2 интерфейса и верстка в файлах hbm.xml + Employee Business кажется избыточным всего за 2 запроса на 2 выпадающих списка. Должен быть лучший способ, не так ли? Я не изменяю записи в таблицах штата или округа в ближайшее время, и даже если бы я это сделал, это было бы не через это приложение. Поэтому я не хочу создавать бизнес-объекты для штата и округа, если мне это не нужно.
Самое простое решение, которое я вижу, это просто создать вспомогательный класс с методами, которые возвращают словари, такие как GetStatesAll (), GetState () и GetCounties () и GetCounty (), но это просто кажется неправильным с точки зрения DDD.
Пожалуйста, помогите. Как я могу использовать DDD без чрезмерных усилий всего за пару простых поисков?
Окончательное решение
Я думаю, что я наконец нашел свой ответ на опыте, который заключался в том, чтобы поместить метод GetStates () в его собственный класс доступа к данным, но не в класс репозитория. Так как у меня был только доступ только для чтения, я бросил его в struct DTO. Поскольку база данных была маленькой, я бросил их в один класс, как описано ниже в Тодде.
Мои выводы:
- Таблицы поиска НИКОГДА не являются объектами значений, потому что таблицы поиска ВСЕГДА имеют идентичность. Если бы у них не было личности, у вас были бы дубликаты, что не имело бы особого смысла.
- Таблица поиска только для чтения может иметь репозиторий, но, вероятно, он не нужен. Цель репозитория - уменьшить сложность, форсируя доступ только через совокупность. Просмотр совокупности дает вам возможность обеспечить соблюдение бизнес-правил, например, не добавлять шины, если у вас нет автомобиля.
- Если вы разрешите обслуживание CRUD для справочной таблицы, то для справочной таблицы имеет смысл иметь собственный репозиторий.
- Тот факт, что я в итоге хранил коды как структуры, не делает их "типами значений". Фаулер говорит в POEAA, что структура является типом значения. Это правда, структуры являются неизменяемыми, поэтому Фаулер говорит, что они являются «типами значений», однако я использовал их по-другому. Я использовал структуры как легкий способ обойти DTO, которые я даже не планировал менять после их первоначального создания. По правде говоря, структуры, которые я использовал, действительно имели идентичность, но поскольку они были доступны только для чтения, они работали как структуры.
- Один шаблон, который я использовал, которого я не вижу в других местах, - сделать поля первичного ключа неизменными. Они устанавливаются конструктором, но доступны только для чтения (не являются частными средствами доступа) и не могут быть изменены после создания объекта.