Проект, в котором я сейчас работаю, требует много страниц поиска / фильтрации. Например, у меня есть сложная страница поиска, чтобы получить вопросы по данным, категории, единице, ...
Issue Domain Class является сложным и содержит множество объектов-значений и дочерних объектов.
. Мне интересно, как люди справляются с поиском / фильтрацией / отчетностью для пользовательского интерфейса. Насколько я знаю, у меня есть 3 варианта, но ни один из них не делает меня счастливее.
1.) Отправка параметров в репозиторий / DAO для получения DataTable и привязки DataTable к элементам управления пользовательского интерфейса. Например, для ASP.NET GridView
DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();
В этом варианте я могу просто пропустить уровень домена и запросить базу данных для заданных спецификаций. И мне не нужно получать полностью построенный комплексный объект предметной области. Нет необходимости в объектах значений, дочерних объектах. Получать данные для отображения в пользовательском интерфейсе в DataTable непосредственно из базы данных и показывать в пользовательском интерфейсе.
Но если нужно отобразить вычисляемое поле в пользовательском интерфейсе, например, возвращаемое значение метода, я должен сделать это в базе данных, потому что у меня нет полностью доменного объекта. Я должен дублировать проблемы логики и DataTable, такие как отсутствие смысла и т. Д ...
2.) Отправьте параметры в репозиторий / DAO для получения DTO и привязки DTO к элементам управления пользовательского интерфейса.
IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();
В этом параметре то же, что и выше, но мне нужно создавать анемичные объекты DTO для каждой страницы поиска. Также для разных страниц поиска проблем я должен показать разные части объектов проблем. IssueSearchDTO, CompanyIssueTO, MyIssueDTO ....
3.) Отправьте параметры в класс Real Repository, чтобы получить полностью сконструированные доменные объекты.
IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...
Мне нравится доменный дизайн и шаблоны. В этой опции нет DTO или логики дублирования. Но в этой опции мне нужно создать много дочерних и ценностных объектов, которые не будут отображаться в пользовательском интерфейсе. Также для этого требуется полное объединение лота, чтобы получить полный объект домена и стоимость производительности для дочерних игл. объекты и объекты стоимости.
Я не использую какой-либо инструмент ORM. Может быть, я смогу реализовать отложенную загрузку вручную для этой версии, но это кажется немного излишним.
Какой из них вы предпочитаете? Или я делаю это неправильно? Есть какие-нибудь предложения или лучший способ сделать это?