Использовать или не использовать репозитории с ORM - PullRequest
0 голосов
/ 27 сентября 2018

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

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

Все шло довольно хорошо, пока я не понял, что часто пишу такие вещи (это не настоящий агрегат, просто искусственный пример):

ctx.Invoices.Include(x => x.User).ThenInclude(x => x.Address).Include(x => x.Items).FirstOrDefault(x => x.Id == id);

Хорошо, поэтому каждый раз, когда мне нужно получить агрегат, мне нужно написать это утверждение, и есть вероятность, что иногда / кто-то забудет включить важную ссылку.

Как насчет передачи этого кода помощнику?класс?

class InvoiceHelper
{
  public Invoice FindById(int id) {...}
}

Разве это не замаскированное начало хранилища?Так что даже с ORM я все еще нахожу репозитории довольно полезными.

Как другие делают эти вещи и все еще кажутся счастливыми без репозиториев?

В некоторых статьях обсуждается подход без репозиториев:

1 Ответ

0 голосов
/ 01 октября 2018

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

Репозиторий - это очень важный шов - адаптер на языке шестиугольника - между вашим приложением и хранилищем.

И да, тот факт, что вам нужно было создать помощник для факторав некоторых случаях выборка данных является прекрасной иллюстрацией этой важности.

[Редактировать] Мысли о статьях "без репозиториев"

Как часто, большинство "хранилище"Обратная реакция "- это чрезмерная реакция на неправильное использование Репозитория и UoW, коренящихся в коллективной амнезии первоначальных причин, лежащих в основе шаблонов.

  • " Зачем скрывать совершенно хорошие рамки? " -EF нет!Например, IDbSet, упомянутый в одной из статей, представляет собой ходячую дырявую абстракцию от самого имени до Attach() для всех его методов расширения.Также см. Ниже неправильное использование и недопонимание таких методов, как Update(), предоставляемых «совершенно хорошей структурой».

    В отличие от этого, исходный шаблон Repository должен был быть минималистичной абстракцией, подобной коллекции из 3 методов, которую выне может пойти не так с.Add(), Remove() и несколько методов Get - все, что нам нужно, а не навороты целого фреймворка.

  • "Репозиторий не выполняет никакого тестированияпроще ": да, это так!Чем меньше контракт зависимости, тем легче рассуждать, тестировать, отлаживать.Aka KISS.

  • "1. Производительность - сортировка / фильтр: в старой (2013 г.) реализации Rep / UoW от Microsoft есть метод GetStudents, который возвращает IEnumerable. Это означает, что любойфильтрация или сортировка будут выполняться в программном обеспечении, что неэффективно. "

    Серьезно?Лишенность учебного примера кода Microsoft, написанного много лет назад, является недостатком № 1 в целом шаблоне?Когда вам просто нужно создать метод внутри реализации репо, и он может быть оптимизирован настолько, насколько вам нужно!

  • Rep / UoW обновит сущность, используя EF Core 'Метод обновления - Говорит кто?Опять соломенный человек.Я использую эти шаблоны более 10 лет и никогда не нуждался в этом методе.SaveChanges () всегда был подходящим способом.

  • Очарование Rep / UoW исходит из того, что вы можете написать один универсальный репозиторий, а затем использовать его дляпостройте все свои под-репозитории

    Абсолютно нет.Это не было частью первоначального шаблона и даже в значительной степени идентифицировалось как анти-шаблон в сообществе с первых дней принятия DDD.

  • "Вариант 2 - в стиле DDDклассы сущностей " ака классы домена, которые осуществляют доступ к данным ... что уничтожает постоянное невежество.Не очень хорошая идея IMO.

Я мог бы продолжать и рассказывать почти о каждом аргументе, но суть его такова:

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

...