Многоразовые запросы в Entity Framework БЕЗ репозитория.Как? - PullRequest
7 голосов
/ 05 августа 2011

Позвольте мне сказать, я пришел к выводу (после долгих испытаний), что репозиторий и единица работы при использовании Entity Framework просто неправильные, неправильные, неправильные и говорит о том, почему довольно хорошо.

Но я действительно ненавижу эти встроенные запросы. Вопрос в том, куда я могу вместо них поместить их, если я против репозитория и т. Д.? (Чистые ответы только, пожалуйста, примеры очень ценятся).

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

/ вздыхает

Richard

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Куда вы собираетесь их положить? У вас есть только несколько вариантов:

  1. Позвольте им быть там, где они есть, и используйте собственные методы расширения, представления запросов , сопоставленные представления базы данных или пользовательские определение запросов для определения повторно используемых частей
  2. Выставлять каждый отдельный запрос как метод в некотором отдельном классе. Метод не должен предоставлять IQueryable и не должен принимать Expression в качестве параметра = вся логика запроса должна быть заключена в методе. Но это сделает ваш класс, охватывающий связанные методы, очень похожим на репозиторий (единственный, который можно смоделировать или подделать). Эта реализация близка к реализации, используемой с хранимыми процедурами.
  3. Вы будете делать то же, что и в предыдущем методе, но вместо того, чтобы помещать запросы в отдельный класс, вы будете помещать их как статические методы непосредственно в сущность. Это гораздо хуже тестируется, потому что статические методы не могут быть заменены насмешками (для этого требуется более сложная среда тестирования). Это часть шаблона активной записи , где каждый объект отвечает за его загрузку и сохранение в базе данных.

Пример пользовательского метода расширения:

public static IQueryable<TEntity> GetByName(this IQueryalbe<TEntity> query, string name) 
    where TEntity : IEntityWithName
{
    return query.Where(e => e.Name == name);
}

Пример пользовательских методов представления классов:

public class QueryProvider
{
    public QueryProvider() {}

    public IEnumerable<TEntity> GetByName(IYourContext context, string name)
        where TEntity : IEntityWithName
    {
        return context.CreateObjectSet<TEntity>().Where(e => e.Name == name).ToList();
    }
}
2 голосов
/ 16 февраля 2012

Создание многоразовых, тестируемых запросов, часть 1

Это сообщение в блоге, которое я написал о создании запросов многократного использования.Использование методов расширения позволяет создавать составные запросы.

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

в следующем примере не используется EF, но заменяется IEnumerable на контекст EF, и вы получаете то, что ищете,параметры передаются через конструктор.

public class PartialMatchQuery : IModelQuery<string, IEnumerable<string>>
{
    private readonly string partial;

    public PartialMatchQuery(string partialString)
    {
        partial = partialString;
    }

    public IEnumerable<string> Execute(IEnumerable<string> model)
    {
        return model.Where(s => s.ToLower().Contains(partial));
    }
}
...