Я бы не стал определять плохую практику нового класса UserOrderTotal
, наоборот.Есть два способа посмотреть на такой объект.
(1) Этот класс UserOrderTotal
можно увидеть как Объект передачи данных (DTO).Таким образом, он не является частью вашего домена.DTO обычно используются для передачи сущностей по проводам или для предоставления доменных объектов в плоской форме на уровень представления.Я использую их все время.В этой ситуации объект используется как проекция на данные: как вид.Шаблон MVVM использует тот же принцип, когда часть ViewModel MVVM является DTO, специфичным для пользовательского интерфейса.
(2) Этот класс UserOrderTotal
можно видеть как часть вашего домена.С точки зрения доменного дизайна объект может быть частью языка пользователя.В такой ситуации было бы логично определить его как объект домена.Разница, однако, заключается в том, что он не будет определен в файле edmx de Entity Framework (EF).Я думаю, что в EF возможно определить сущности, которые не имеют сопоставления с таблицей базы данных, но я не знаю, облегчает ли это процесс.Лично я не вижу проблемы с определением этих доменных объектов вне файла edmx в том же проекте, где находится edmx.
О возврате массива User
объектов: это кажется плохой идеей.Есть несколько проблем с этим подходом.Прежде всего, ваш код не очень хорошо передает свои намерения.Вы используете объект User
, но оставляете все свойства пустыми.Эта практика очень трудна для тех, кто пытается использовать этот код.Вы фактически используете объект User
для чего-то, что не является: а именно, для агрегата.
Кроме того, вы заметили, что EF не может обработать это дополнительное свойство, добавленное вами в модель.Хотя в целом можно добавить свойства в модель EF (используя частичные классы), вы должны быть очень консервативны в этом.В то время как вещи будут компилироваться, они не будут работать во время выполнения, когда вы будете использовать эти свойства в запросах LINQ.
Создание класса-оболочки для каждого запроса (!), Который включает агрегирование, кажется немного нелепым.
Я так не думаю.ИМО это правильно делать.Это является следствием использования EF в многоуровневой архитектуре.Я должен признать, что иметь EF в одном слое намного проще, но в долгосрочной перспективе это становится действительно грязным.Чем больше проект и чем дольше вам нужно его поддерживать, тем больше оправдано добавление слоев абстракций.
Как вы, ребята, справляетесь с этим, используете ли вы классы "репозиторий" с LINQ
Приложение, которое я разработал, часто имеет служебный / бизнес-уровень, который отделяет чтения от мутаций.Для операций чтения / запросов я использую статические классы с методами, которые возвращают коллекцию объектов домена или DTO.Часто такой «метод обслуживания» является специфическим для определенной части пользовательского интерфейса.Мутации заключены в «служебные команды».Пользовательский интерфейс создает сервисную команду и запускает ее.Команда выражает один случай использования или пользовательскую историю и является атомарной частью логики.Сервисный уровень обеспечит создание транзакции базы данных (при необходимости) при выполнении команды.Для пользовательского интерфейса использование команды обычно выглядит так:
void UpdateButton_Click(object sender, EventArgs e)
{
if (!this.Page.IsValid)
{
return;
}
var command = new UpdateUserSettingsCommand();
command.UserName = this.UserName.Text;
command.MailAddress = this.MailAddress.Text;
command.Execute();
}
Надеюсь, все это имеет смысл.Если вы хотите узнать больше о том, как я использую DTO, прочитайте мой SO-ответ .
Надеюсь, это поможет.