Я пытаюсь выбрать лучший шаблон для доступа к данным в моем приложении 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 или единые классы.
Большое спасибо, Матовое