Обработка видов с помощью репозитория - PullRequest
0 голосов
/ 02 мая 2011

Каков наилучший способ обработки представлений (классов, которые не представляют сущности, но используются, например, для привязки списка DropDown) с использованием шаблона хранилища? Например, у меня есть следующий клиентский объект

public class Customer {
  Guid ID {get;set;}
  string FirstName {get;set;}
  string LastName {get;set;}
  List<Address> Addresses {get;set;}
}

и хранилище

public class CustomerRepository : IRepository<Customer> {
   Customer GetByID(Guid id) { ... }
   List<Customer> GetAll() { ... }
   // Insert/Delete/Update Customer etc.
}

Теперь я хочу заполнить DropDown списком клиентов вместе с их базовым адресом, используя их идентификаторы в качестве значения свойства. У меня есть хранимая процедура, возвращающая эти данные, и я могу получить ее результат в список следующих объектов:

public class CustomerWithBaseAddress {
  public Guid CustomerID {get;set;}
  public string FullNameWithBaseAddress { get;set; }
}

Должно ли хранилище Клиента возвращать такие объекты или оно должно управляться другим специализированным хранилищем (но без операций сохранения / удаления)?

Ответы [ 2 ]

1 голос
/ 03 мая 2011

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

Вы должны быть осторожны при использовании этого подхода с объектами, которые, однако, могут быть ошибочно приняты за объект домена. Убедитесь, что вы не используете CustmerWithBaseAddress для чего-либо, кроме выбора из раскрывающегося списка и т. Д. Поэтому, как только вы выбрали объект CustmerWithBaseAddress, вы должны получить реальный объект Customer и не позволять CustmerWithBaseAdress просачиваться в остальную часть кода приложения.

1 голос
/ 03 мая 2011

Репозиторий должен обрабатывать только агрегатный корень и его агрегаты. Это означает, что он может обрабатывать Customer, CustomerOrders и т. Д.

A CustomerWithBaseAddress, однако, является ViewModel и не имеет ничего общего с базой данных. Он должен быть встроен в ваш контроллер с помощью репозиториев.

Вы можете использовать AutoMapper или аналогичный для отображения.

...