Конкретные запросы в репозитории - PullRequest
1 голос
/ 02 августа 2011

Я много читал о шаблоне репозитория (Linq2SQL или EF).Я видел несколько репозиториев с некоторыми конкретными запросами, такими как FindUserByName, где я передавал бы выражение where в репозиторий.

С другой стороны, я видел некоторые репозитории с просто «Сохранить, обновитьи GetAll "и GetAll возвращают IQueryable.И этот IQueryable фильтруется в слое сервиса.

Так что, по вашему мнению, хорошо ли передавать определенные запросы в хранилище или просто сделать его как можно более простым, чтобы все фильтры выполнялись в сервисе?

Спасибо!

1 Ответ

2 голосов
/ 02 августа 2011

Мой совет - создать GenericRepository<T>, который имеет основные базовые методы (Find, Save, Delete и т. Д.).

Пример:

public abstract class GenericRepository<T> : IRepository<T> where T : class
{
    public T FindSingle(Expression<Func<T,bool>> predicate) { .. };
    public IQueryable<T> Find() { .. };
    public void Delete(T entity) { .. };    
}

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

Пример:

public class EmployeeRepository : GenericRepository<Employee>, IRepository<Employee>
{
   public Employee FindByLastName(string lastName)
   {
      return FindSingle(emp => emp.LastName == lastName);
   }

   public ICollection<Employee> FindAllManagers()
   {
      return Find().Where(emp => emp.Type == "Manager").ToList();
   }

   // other methods...
}

Это означает, что вы не дублируете общий код в своих хранилищах.

И да, другой альтернативой являетсяесть услуги, которые работают от GenericRepository<T>.Это означает, что сервисы (по сути) являются специализированным репозиторием.

Так что это просто вопрос предпочтения, если вы хотите сервисный уровень или специализированные репозитории.

...