Я настоятельно рекомендую использовать упрощенный шаблон репозитория, который поможет при проверке источника данных для тестирования и обеспечит большую гибкость. Я не рекомендую использовать универсальные репозитории, а скорее для обработки репозитория, похожего на контроллер. (Я работаю с данными для определенного набора операций) Это сокращает количество ссылок на зависимости, хотя предпочитает SRP над DNRY.
Например:
public class OrderRepository : IOrderRepository
{
private MyDbContext Context
{
return _contextLocator.Get<MyDbContext>() ?? throw new InvalidOperation("The repository must be called from within a context scope.");
}
IQueryable<Order> IOrderRepository.GetOrders()
{
var query = Context.Orders.Where(x => x.IsActive);
return query;
}
IQueryable<Order> IOrderRepository.GetOrderById(int orderId)
{
var query = Context.Orders.Where(x => x.IsActive && x.OrderId == orderId);
return query;
}
Order IOrderRepository.CreateOrder( /* Required references/values */)
{
}
void IOrderRepository.DeleteOrder(Order order)
{
}
}
Возвращая IQueryable, потребительский код может сохранять контроль над необязательными критериями фильтрации, сортировкой, разбиением на страницы и операциями с данными, не вызывая ненужных операций чтения данных. Нет необходимости в сложных параметрах выражения для фильтрации, сортировки или дополнительных параметров для управления подкачкой страниц. Хранилище служит привратником для необходимых фильтров, таких как IsActive, проверки авторизации и т. Д. Хранилище также может служить фабрикой сущностей, гарантируя, что все обязательные поля и ссылки предоставляются при создании новой сущности. Я также позволил репозиторию управлять операциями удаления, чтобы обеспечить выполнение всей проверки и целостности, а также аудит записей и обработку сценариев мягкого удаления. (IsActive)
Некоторые люди избегают использования IQueryable на том основании, что он «пропускает» EF-измы в контроллеры. Тем не менее, он пропускает их не более, чем сложные методы, передающие выражения в попытке абстрагировать EF. Каждое выражение условия одинаково уязвимо к необходимости соответствия EF-измам. (То есть, передавая упорядоченное выражение, которое ссылается на закрытый метод на объекте или статический метод)
Преимущество такого шаблона хранилища (по сравнению с простым доступом к коду DbSets) - простота тестирования. Модерируемое хранилище просто должно вернуть List<T>
AsQueryable
, и ваши контроллеры и т. Д. Могут быть протестированы изолированно. Он также обеспечивает хорошую централизацию необходимых фильтров и операций с объектами.