Должен ли каждый тип объекта (Клиент, Продукт, Категория, Счет-фактура и т. Д.) Иметь собственный репозиторий
В вашем домене должен быть репозиторий для каждого корня агрегата,См. Этот вопрос для получения дополнительной информации о том, что такое совокупный корень.
В приведенном вами примере я мог видеть CustomerReposiotry, который будет обрабатывать получение всех соответствующих данных клиента (у клиента есть заказы, которые имеет заказклиент).ProductRepository, который обрабатывает получение информации о продукте.
и обслуживание?Если да, то как вы объединяете общие элементы?
Служебный слой хорош, но только если в добавлении этого слоя есть добавленная стоимость.Если ваш сервис просто переходит прямо в хранилище, он может не понадобиться.Однако если вам необходимо выполнить определенную бизнес-логику для продукта, ProductService может иметь смысл.
Это может не иметь смысла
public void UpdateProduct(Product product)
{
_repo.Update(product);
}
Но если у вас есть логика, этот уровень имеет смысл инкапсулироватьбизнес-правила для продуктов.
public void UpdateProduct(Product productToUpdate)
{
//Perform some sort of business on the productToUpdate, raise domain events, ....
_repo.Update(productToUpdate);
}
Поэтому я подумал, что мне нужен ShopController, у которого есть ShopViewModel, который может иметь категории, подкатегории, продукты и т. д. Но проблема для меня,в том, что он просто не выглядит хорошо.
Если домен очищен, модель представления имеет смысл
public ActionResult Index()
{
ShopViewModel shopViewModel = new ShopViewModel();
shopViewModel.Products = _productRepo.GetAll();
//other stuff on the view model.
return(shopViewModel);
}
Обновление
Что происходит, когда вам также необходимо предоставить данные, недоступные из сводного корня?Например, скажем, у меня есть представление «Создание клиента», и в этом представлении мне также нужно предоставить пользователю набор компаний, из которых можно выбрать нового пользователя для связи с ним.Приходит ли коллекция компаний из CustomerRepository или вам также нужен CompanyRepository?
Если компания может жить сама по себе (например, вы редактируете, обновляете, удаляете компанию), я бы предложила, чтобы компания такжеСовокупный корень для вашего домена (у Клиента есть компания, а у компании есть список Клиентов).Однако, если Компания может быть получена только через Клиента, я бы отнес компанию к объекту ValueType / Value.В этом случае я бы создал метод в репозитории клиентов для извлечения всех имен компаний.
_repo.GetAllCompanyNames();