Загрузка моделей презентаций напрямую из базы данных - PullRequest
1 голос
/ 13 сентября 2010

Я работаю над двухуровневым приложением, в котором клиент WinForms выполняет прямые вызовы в базу данных. В одном из сценариев мне нужно отобразить список сущностей Customer для пользователя. Проблема в том, что сущность Customer содержит много свойств (некоторые довольно тяжелые), и мне нужно только два из них - имя и фамилия. Поэтому, чтобы повысить производительность и сделать логику представления более понятной, я хочу создать некоторый класс CustomerSummaryViewModel только с необходимыми свойствами и использовать функцию проекций NHibernate для его загрузки. Меня беспокоит то, что в этом случае моя логика доступа к данным становится связанной с представлением, и мне это кажется концептуально неправильным.

Как вы думаете, это нормально или есть лучшие решения?

1 Ответ

0 голосов
/ 13 сентября 2010

Я думаю, что вы можете рассматривать CustomerSummaryViewModel как отчет (CustomerSummaryReport). Можно запросить у ваших сущностей сценарии, подобные этому, и рассматривать их как отчеты. Большинство отчетов являются более сложными, с использованием нескольких объектов и совокупных запросов. Этот отчет очень прост, но вы все равно можете использовать его как отчет.

Вы также упоминаете, что производительность значительна. Это еще одна причина использовать отдельный отчетный запрос и DTO. Сущность клиента звучит как одна из «основных» сущностей, которые вы используете. То, что для извлечения их из базы данных с отложенными загруженными свойствами не инициализируется значительное время, может быть предупреждением для оптимизации самой сущности клиента, вместо этого используется запрос отчетов для получения информации о них. Просто предупреждение, потому что я видел случаи, когда это было необходимо.

Кстати, вы можете рассмотреть linq вместо проекций для более простого синтаксиса, такого как:

var reports = session.Linq<Customer>()
  .Where(condition)
  .Select(customer => new Report 
   { 
       FirstName = customer.FirstName, 
       LastName = customer.LastName 
   })
  .ToList();
...