Какой из них вы предпочитаете для поиска/отчетности DataTable, DTO или класса домена?

StackOverflow https://stackoverflow.com/questions/392806

Вопрос

Проект, над которым я сейчас работаю, требует большого количества страниц поиска/фильтрации.Например, у меня есть сложная страница поиска для получения проблем по данным, категории, единице измерения...

Класс предметной области задачи сложен и содержит множество объектов-значений и дочерних объектов.

Мне интересно, как люди справляются с поиском/фильтрацией/отчетностью для пользовательского интерфейса.Насколько я знаю, у меня есть три варианта, но ни один из них не делает меня счастливее.

1.) Отправьте параметры в репозиторий/DAO, чтобы получить DataTable и привязать DataTable к элементам управления пользовательского интерфейса. Например, в ASP.NET GridView.

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

В этом варианте я могу просто обойти уровень домена и запросить базу данных по заданным спецификациям.И мне не нужно получать полностью построенный сложный объект домена.Нет необходимости в объектах-значениях, дочерних объектах и ​​т. д.Получите данные для отображения в пользовательском интерфейсе в DataTable непосредственно из базы данных и отобразите их в пользовательском интерфейсе.

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

2.) Отправьте параметры в репозиторий/DAO, чтобы получить DTO и привязать DTO к элементам управления пользовательского интерфейса.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

Этот вариант аналогичен описанному выше, но мне нужно создавать анемичные объекты DTO для каждой страницы поиска.Также для разных страниц поиска проблем мне нужно показывать разные части Issue Objects.IssueSearchDTO, CompanyIssueTO, MyIssueDTO....

3.) Отправьте параметры в класс Real Repository, чтобы получить полностью построенные объекты домена.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

Мне нравится предметно-ориентированный дизайн и шаблоны.В этом варианте нет логики DTO или дублирования. Но в этом варианте мне нужно создать партии дочерних объектов и объектов значений, которые не будут отображаться в пользовательском интерфейсе. Также требуется объединение лотов, чтобы получить полный объект домена и стоимость производительности для дочерних элементов игл. объекты и объекты-ценности.

Я не использую какой-либо инструмент ORM. Возможно, я смогу вручную реализовать отложенную загрузку для этой версии, но это кажется немного излишним.

Какой из них вы предпочитаете? Или я делаю это неправильно?Есть ли какие-либо предложения или лучший способ сделать это?

Это было полезно?

Решение

У меня есть несколько предложений, но общий ответ, конечно, «это зависит».

Во-первых, вам следует использовать инструмент ORM или у вас должна быть веская причина не делать этого.

Во-вторых, реализовать отложенную загрузку вручную относительно просто, поэтому, если вы не собираетесь использовать инструмент ORM, вы можете просто создать свойства для своих объектов, которые говорят что-то вроде:

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

В-третьих, производительность — это то, что следует учитывать изначально, но это не должно отвлекать вас от элегантного дизайна.Я бы сказал, что вам следует изначально использовать (3) и отклоняться от него только в том случае, если его производительность недостаточна.Это приводит к написанию наименьшего количества кода и минимальному дублированию в вашем проекте.

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

Другие советы

Это большой вопрос, и я тоже хотел дать свой ответ.я думаю технически лучший Ответ - использовать вариант №3.Он обеспечивает возможность лучшего описания и организации данных, а также масштабируемость для будущих улучшений отчетов и поисковых запросов.

Однако хотя в целом это может быть лучшим вариантом, IMO требует огромных затрат по сравнению с этим.другие (2) варианты представляют собой дополнительное время разработки для всех классов и отношений, необходимых для поддержки потребностей в отчетности (опять же при условии, что инструмент ORM не используется).

Я тоже борюсь с этим во многих своих приложениях, и реальность такова, что №2 — лучший компромисс между временем и дизайном.Теперь, если вы спрашиваете о своих бизнес-объектах и ​​всех их потребностях, есть нет Вопрос в том, что полностью продуманная и правильно спроектированная модель важна и ей нет замены.Однако когда дело доходит до сообщения и поиска, для меня это совсем другое дело.#2 предоставляет строго типизированные данные в анемичных классах и не так примитивен, как жестко закодированные значения в наборах данных, таких как #1, и при этом значительно сокращает время, необходимое для завершения проектирования, по сравнению с #3.

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

Подводя итог, можно сказать, что №3 — технически лучший вариант, но №2, вероятно, является наиболее реалистичным и жизнеспособным вариантом, если учитывать время и качество вместе для сложных задач отчетности и поиска.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top