Репозитории должны подвергнуть IQueryable уровню служб или выполнить просачивание реализации?

Я пытаюсь выбрать лучший шаблон для доступа к данным в моем приложении MVC. В настоящее время, следуя за рядом витрины MVC, я использую репозитории, подвергая IQueryable уровню служб, который затем применяет фильтры. Первоначально я использовал LINQtoSQL, например.

public interface IMyRepository
{
  IQueryable GetAll();
}

Реализованный в:

public class LINQtoSQLRepository : IMyRepository
{
   public IQueryable GetAll()
   {
      return from table in dbContext.table
             select new MyClass
             {
                Field1 = table.field1,
                ... etc.
             }
   }
}

Фильтр для идентификаторов:

public static class TableFilters 
{       
   public static MyClass WithID(this IQueryable qry, string id)
   {
      return (from t in qry
              where t.ID == id
              select t).SingleOrDefault();
   }     
}

Названный от сервиса:

public class TableService
{
   public MyClass RecordsByID(string id)
   {
      return _repository.GetAll()
                        .WithID(id);
   }
}

Я столкнулся с проблемой, когда я экспериментировал с реализацией репозитория с помощью Платформы Объекта с LINQ к Объектам. Класс фильтров в моем проекте содержит некоторые более сложные операции, чем, "ГДЕ... ==..." в примере выше, которому я верю, требуют различных реализаций в зависимости от поставщика LINQ. Конкретно у меня есть требование для выполнения SQL "ГДЕ... В..." пункте. Я могу реализовать это в использовании класса фильтра:

string[] aParams = // array of IDs
qry = qry.Where(t => aParams.Contains(t.ID));

Однако для выполнения этого против Платформы Объекта, я должен предоставить решение, такое как BuildContainsExpression, который связывается с Платформой Объекта. Это означает, что у меня должно быть 2 различных реализации этого конкретного фильтра, в зависимости от базового поставщика.

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

Большое спасибо, Матовое

11
задан matt 18 May 2010 в 13:14
поделиться