Желая использовать другой метод в ZonRepository, которого нет в интерфейсе, вы нарушаете принцип LSP в SOLID принципах. Репозитории IMO generi c являются антипаттернами, поскольку они сильно ограничивают возможности, предлагаемые EF ради «согласованности». Мое золотое правило: «Не пытайтесь быть последовательными ради согласованности».
Чтобы добавить к ответу Карла, вы должны создать контрактный интерфейс с именем IZoneRepository
, который расширяет IBaseRepository<Zone>
, и добавить сюда нужные методы. .
public interface IZoneRepository : IBaseRepository<Zone>
{
void SomethingZoneSpecific();
}
Тогда в вашем классе:
public class ZoneRepository : IZoneRepository
{
public void SomethingZoneSpecific()
{
//...
}
// And all of the IBaseRepository<Zone> implementations...
}
Затем зарегистрируйте ZoneRepository
вместо IZoneRepository
вместо IBaseRepository<Zone>
и измените зависимость вашего контроллера на IZoneRepository
.
Вам следует пересмотреть использование шаблона c generi из-за таких методов, как ваша реализация "GetAll ()". В Entity Framework использование таких методов крайне неэффективно. Вы можете фильтровать, сортировать и разбивать на страницы в вашем контроллере, используя такой код:
var data = Repository.GetAll()
.Where(x => x.ParentId == parentId)
.OrderByDescending(x => x.CreatedAt)
.Skip(pageSize * page)
.Take(pageSize)
.ToList();
Но ваш метод GetAll()
уже извлекает все строки из таблицы перед фильтрацией на стороне клиента. Это много данных для отправки из БД на сервер и много памяти, необходимой для запроса на сервере, чтобы потенциально гораздо меньше данных было отправлено обратно клиенту. Тогда возникает проблема, когда у вас могут быть связанные объекты (свойства навигации), к которым можно получить доступ. Это может привести к отложенным загрузкам, поэтому запускаются дополнительные запросы. Эти ограничения часто приводят к тому, что разработчикам приходится искать отклонения от шаблонов «поймать все» c, когда возникают проблемы с производительностью. EF может очень хорошо смягчить эти проблемы с помощью проекции, в которой методы Select
вместе с OrderBy
, Where
и вызовами Pagination против IQueryable
могут привести к запросам, которые возвращают только те данные, которые требуются из БД. По этим причинам следует избегать шаблона generi c, поскольку в конечном итоге вы теряете большую часть того, что EF может принести на стол для построения эффективных и высокопроизводительных систем.