Некоторые проблемы с шаблоном хранилища Роба Конери - PullRequest
9 голосов
/ 16 февраля 2010

Пожалуйста, прочитайте мое обновление в конце вопроса после прочтения ответов:

Я пытаюсь применить шаблон хранилища как Роб Конери описал в его блог в разделе " MVC Storefront ". Но я хочу спросить о некоторых вопросах что у меня было до того, как я применил этот дизайн шаблон.

Роб создал свою собственную "Модель" и использовал некоторые ORM «LINQ to SQL или Entity Framework (EF)» для сопоставления его базы данных с Сущности.

Затем он использовал пользовательские репозитории, которые дает IQueryable<myModel> и в эти хранилища он сделал своего рода Отображение или "Разбор" между ORM Entities и его Model классами.

Что я здесь спрашиваю:

Можно ли сделать пользовательское сопоставление между ORM Entities и моим модель "classes" и просто загрузить свойства, которые я хочу? надеюсь суть ясна.

Обновление для POCO

**

Это то, что я решил после многих предложений и попыток:

**

В конце концов, учитывая мнение мистера Роба Конери, у меня есть лучшее решение:

  1. Я построил свою модель как "POCO s" и поместил их в свои "Слои моделей", чтобы они не имели никакого отношения к файлу "edmx".
  2. Построил мои репозитории для работы с этой моделью "POCO", зависящей от "DbContext"
  3. Затем я создал «ViewModels», чтобы получить только ту информацию, которая нужна для просмотра из этих репозиториев.

Так что мне не нужно добавить еще один слой , чтобы быть между "EF Models" и "My Model". Я просто немного скручиваю свою модель и заставляю EF справиться с ней.

Как я вижу, этот образец лучше, чем у Роба Конери.

Ответы [ 4 ]

19 голосов
/ 25 февраля 2010

Да, это возможно, если вы используете LINQ to SQL. Все, что вам нужно сделать, это использовать проекцию, чтобы извлечь нужные данные в выбранный вами объект. Вам не нужно все это оформление с интерфейсами и еще много чего - если вы используете модель, специфичную для представления (что звучит так, как вам нужно) - создайте класс ViewModel.

Давайте назовем это ProductSummaryView:

public class ProductSummaryView{
   public string Name {get;set;}
   public decimal Price {get;set;}
}

Теперь загрузите его из хранилища:

var products= from p in _repository.GetAllProducts
              where p.Price > 100
              select new ProductSummaryView {
                  Name=p.ProductName,
                  Price=p.Price

              }

Это потянет все товары, где цена> 100, и вернет IQueryable. Кроме того, поскольку вы запрашиваете только два столбца, в вызове SQL будут указаны только два столбца.

3 голосов
/ 16 февраля 2010

Не уклоняйтесь от вашего вопроса, но в конечном итоге вам решать, как будет работать ваш репозиторий.

Высокоуровневая предпосылка заключается в том, что ваш контроллер будет указывать на некоторый интерфейс репозитория, скажем IRepository<T> where T : IProduct. Реализация которого может сделать любое количество вещей - загрузить всю базу данных с диска и сохранить ее в памяти, а затем проанализировать выражения LINQ, чтобы получить данные. Или он может просто вернуть фиксированный набор фиктивных данных для целей тестирования. Поскольку вы пытаетесь использовать интерфейс репозитория, у вас может быть любое количество конкретных реализаций.

Теперь, если вам нужна критика конкретной реализации Роба, я не уверен, что это имеет отношение к переполнению стека.

2 голосов
/ 16 февраля 2010

DeferringTheLoad

Помните, что IQueryable откладывает всю загрузку до последнего ответственного момента. Вам, вероятно, не придется загружать все данные, используя операторы LINQ, чтобы получить нужные данные. ; )

Уважая зависимость в классах домена в представлениях, я скажу НЕТ. Используйте шаблон ViewModel для этого. Это более ремонтопригодно; Вы можете использовать AutoMapper , чтобы избежать проблем с отображением, и они очень гибки в сценариях составных представлений:)

Согласно новому вопросу ... Ответ - да, вы можете. Как говорит Роб Конери, используйте проекцию; ):

var query = from p in DataContext.Persons}
select new Persons
{
  firstname = p.firstname,
  lastname = p.lastname
});
2 голосов
/ 16 февраля 2010

Хотя можно заполнить часть объекта на основе запроса подмножества столбцов для этого объекта, используя запрос (который не имеет ничего общего с шаблоном хранилища), это не так, как все «обычно» делается.

Если вы хотите вернуть подмножество объекта, вы обычно создаете новый класс только с этим подмножеством свойств. Это часто (в мировоззрении MVC) называют классом View Model. Затем вы используете проекционный запрос для заполнения этого нового класса.

Вы можете делать все это независимо от того, используете вы шаблон хранилища или нет. Я бы сказал, что между этими двумя понятиями нет противоречивого совпадения.

...