Реализация шаблона спецификации Entity Framework - PullRequest
17 голосов
/ 01 марта 2010

Как реализовать шаблон спецификаций с Entity Framework?

Ответы [ 4 ]

17 голосов
/ 28 января 2011
  1. Спецификация:
    Для тех, кто хочет учебник для начинающих, посетите эту ссылку .

  2. Понимание спецификации для Entity Framework:
    Прочитайте это . Это охватывает следующие очень важные моменты. В любом реальном приложении вы захотите объединить несколько спецификаций. Это называется составлением спецификаций. Вам нужно будет понять некоторые предостережения для разрешения состава спецификации в Linq to Entities. Вы должны знать это, потому что использование Linq to Entities является желательным подходом для выражения критериев соответствия спецификации.

  3. Исправить зло:
    Загрузите и установите this . Это исправляет недостаток Linq для сущностей, о котором вы читали на втором шаге. Это объясняет более подробно реализацию исправления.

  4. Реализация!
    У вас должно быть достаточно информации для реализации шаблона. Продолжайте гуглить. Делать это для EF не совсем просто, но оно того стоит. Это - очень интересная реализация.

4 голосов
/ 01 марта 2010

В принципе, не должно быть ничего особенного (из-за EF) при реализации шаблона спецификации. Вы реализуете спецификации как отдельные классы, которые работают с моделью вашего домена.

Вы можете найти множество статей или веб-трансляций о шаблоне спецификации, и даже некоторые, которые используют EF, например, здесь и здесь .

1 голос
/ 01 марта 2019

Просто используйте NSpecification lib. Это бесплатно. Вы можете использовать его с любым ORM на основе интерфейса IQueryable, например Entity Framework или Linq2Sql: https://github.com/jnicolau/NSpecifications

Или получить его от Nuget:

Спецификации пакета установки NS-Версия 1.1.0

0 голосов
/ 05 апреля 2018

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

Обычно люди предоставляют другой метод в интерфейсе спецификации, представляющий дерево выражений, которое должно быть отправлено в Entity Framework:

public interface ISpecification<T>
{
    bool IsSpecifiedBy(T item);
    Expression<Func<T, bool>> GetPredicate()
}

Хранилище вызовет метод GetPredicate и передаст его методу Where в DbSet EF. Таким образом, вы ограничили, какие выражения будут генерироваться, и гарантируете, что он сгенерирует допустимый оператор SQL.

Чтобы включить логические операторы в спецификации, вам нужно смешать выражения вместе. это сообщение от Владмира Хорикова , где он подробно объясняет, как это сделать.

Мне обычно не нравится это решение, так как оно предполагает, что ваша модель домена совпадает с вашей моделью персистентности . Большинство людей в порядке с этим. Но мне нравится держать вещи ОЧЕНЬ разделенными на луковой архитектуре .

Опытным путем я обнаружил, что в конечном итоге Entity Framework будет загрязнять модель вашего домена с помощью dbcontexts, атрибутов EF, открытых сеттеров, свойств, которые имеют смысл только для базы данных и т. Д.

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

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

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

Я недавно написал серию постов, в которых объясняю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...