Некоторые проблемы о шаблоне репозитория Rob Conery

Считайте мое обновление в конце вопроса после чтения ответов:

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

Ограбьте сделал его собственную "Модель" и привык некоторый ORM "LINQ для SQL или Платформы объекта (EF)" для отображения его базы данных на Объекты.

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

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

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

Обновление для ПОСТЕПЕННО

**

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

**

В конце концов, и относительно мнения г-на Rob Conery у меня есть лучшее решение как:

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

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

Поскольку я вижу, что этот шаблон лучше, чем один Rob Conery.

9
задан Peter Mortensen 2 December 2018 в 16:55
поделиться

4 ответа

Да, это возможно, если вы используете 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-вызове будут указаны только два столбца.

19
ответ дан 4 December 2019 в 08:15
поделиться

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

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

Теперь, если вы ищете критику конкретной реализации Роба, я не уверен, что это уместно для Stack Overflow.

3
ответ дан 4 December 2019 в 08:15
поделиться

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

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

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

2
ответ дан 4 December 2019 в 08:15
поделиться

DeferringTheLoad

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

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

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

var query = from p in DataContext.Persons}
select new Persons
{
  firstname = p.firstname,
  lastname = p.lastname
});
2
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: