2016-08-26 2 views
0

Предположим, у меня есть следующие модели домена:Проектирование DTOS, которые содержат списки объектов

Project    Task 
    - Id     - Id 
    - Name     - Name 
    - List<Task>   - Project 

Проекты имеют много задач и задач, есть один проект.

Теперь предположим, что я хочу создать объект передачи данных TodoListDTO. Моя первоначальная мысль состояла в том, чтобы просто сделать это:

TodoListDTO 
    - List<Project> 

Кажется простым. Затем у меня есть доступ к списку задач в каждом проекте. Затем я читал в нескольких местах, что DTO должны быть как можно более плоскими. Но как бы я смоделировал это без использования сложных объектов?

Вместо TodoListDTO, я мог бы ProjectDTO, который выглядит примерно так:

ProjectDTO 
    - ProjectId 
    - Name 
    - List<TaskId> 
    - List<TaskName> 

Но имеющие отдельные списки TaskIds и TaskNames кажется неудобным, и я не понимаю, как это лучше, чем просто имея Перечислите свойство в ProjectDTO.

Что такое хороший способ справиться с этим?

+0

Как можно более плоский, не препятствует правильному моделированию проблемы. Если у проекта есть задачи, а задачи имеют один проект, то я не вижу ничего плохого в вашем первоначальном дизайне. – saarrrr

+0

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

+0

Ну а * Данные * ** Транспорт ** * Объект * используется для передачи данных (f.i. импорт/экспорт данных в конкретный формат JSON/XML/..). Модели для EF также являются DTO (транспортные данные из/в базу данных). Каково намерение для DTO в вопросе? –

ответ

1

Ваши предыдущие классы были достаточно простыми и стандартным способом сделать это. Вы должны создать класс Context, который будет содержать список проектов и задач. Всего три класса.

+0

Вы имеете в виду класс Context с двумя отдельными списками (один для проектов и один для задач) или один список проектов, каждый элемент которого имеет свой собственный список задач? – jrsowles

+0

Да, я имею в виду два отдельных списка. Однако вы можете опустить список задач, если это позволяет его scenerio. Стандартный способ заключается в том, что Context содержит списки всех классов сущностей. –

+0

Также, как предположил Мэттью, между проектами и задачами существует отношение «многие ко многим». Таким образом, вы можете создать ассоциативный класс для его обработки. –

4

Другая вещь, которую вы могли бы сделать, это создать другой домен модель

ProjectTask 
    - ProjectId 
    - ProjectName 
    - TaskId 
    - TaskName 

Это может помочь с отношением один-ко-многим (также позволяет многие-ко-многим) и боковой шаговый запутанным circluar project- > task-> Project-> task. Отсюда вы можете получить свою клиентскую группу API всех ProjectTasks projectId и обрабатывать ее таким образом.

Это, как говорится, я думаю, что ваш первоначальный путь в порядке, но вот альтернатива.

Смежные вопросы