Я думаю, вы упустили момент, когда люди реализуют шаблон хранилища, когда EF уже реализует шаблон хранилища через ObjectSet / DbSet?
Популярный ответ будет, потому что многие учебники советуют использовать его без объяснения причин. Есть веские причины не использовать Уровень репозитория поверх ObjectSet / DbSet. Однако я укажу несколько причин, почему это предпочтительнее.
Фильтры по умолчанию
Есть много ситуаций в реальных приложениях, где вам нужен фильтр по умолчанию. Например, снятая с производства продукция не продается. Если вы выставите продукты ObjectSet / DbSet напрямую, возникнут проблемы, если кто-то забудет применить фильтр по умолчанию. Это также позволяет избежать дублирования логики. Вы также можете изменить фильтр по умолчанию позже, не нарушая проблем.
public IQueriable<Product> GetAll()
{
return context.Products.Where(p => !p.IsDiscontinued);
}
Soft Deletes
Многие приложения используют мягкое удаление, когда вы сохраняете столбец, такой как IsDeleted
, фактически не удаляя строку. Теперь ObjectSet / DbSet имеет метод Delete
, но как только вы вызовете этот метод, он назначит значения null
для обнуляемых свойств FK. Вы можете не хотеть этого.
public void Delete(Product product)
{
// can apply any other logic here
product.IsDeleted = true;
}
Только для чтения сущностей
Существует много ситуаций, когда какое-то другое приложение отвечает за создание, удаление и обновление сущностей, а ваше приложение отображает только сущность. Но ObjectSet / DbSet предоставляет неподдерживаемую функциональность в этом случае. Еще одним преимуществом в этом случае будет использование опции NoTracking
для сокращения времени материализации сущности.
Переключение доступа к данным без раскрытия реализации В некоторых случаях LINQ недостаточно. Здесь вы можете использовать сырой SQL или SP. Наличие репозитория позволит избежать использования различных методов запроса / обновления, когда функциональность, предоставляемая EF, недостаточна.
Работа с существующими базами данных
Когда у вас нет возможности создать базу данных, которую EF может обработать. Существующая таблица может иметь столбцы Sql Variant
, XML
. Дублирование записей в другие таблицы и бесчисленное множество других случаев, которые вам нужно обработать, чтобы сохранить целостность базы данных.
Эти методы могут не быть пуленепробиваемыми, но пригодятся, если того потребует ситуация. Я бы посоветовал не переходить прямо к репозиториям, о которых вам лучше подумать, добавляет ли еще один уровень абстракции, необходимый для реализации необходимых функций.