Мой совет - создать 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>
.Это означает, что сервисы (по сути) являются специализированным репозиторием.
Так что это просто вопрос предпочтения, если вы хотите сервисный уровень или специализированные репозитории.