Часть репозитория абстрагирует детали персистентности.
Я вижу две проблемы с вашим предложением:
- Вы пропускаете абстракцию больше, чем необходимо, называя эти методы«opendb» и «closedb» и
- Если вы идете по этому маршруту, вы должны вернуть
IDisposable
(объект соединения) из метода opendb()
и заключить действие в блок using
вубедитесь, что соединение закрыто.
Как правило, вы можете просто позволить репозиторию создать соединение для каждого метода, поэтому вам просто нужно получить его прямо в ваших методах репозитория.Проблема возникает, когда вы хотите выполнить несколько действий с хранилищем, не используя отдельное соединение для каждого элемента.
Чтобы достичь этого, вы можете раскрыть понятие единицы работы из хранилища.Ваша единица работы будет реализовывать интерфейс для методов хранилища, поэтому вы не можете вызывать их вне единицы работы.Он также реализует IDisposable
, поэтому всякий раз, когда вы заходите в свой репозиторий, вы будете использовать блок using
.Внутри хранилище будет управлять соединением, но не будет раскрывать соединение и «говорить об этом».
Например:
public ActionResult SomeAction(int CarId)
{
using (var repo = CarRepository.BeginUnitOfWork())
{
var car = repo.read(CarId);
// do something meaningful with the car, do more with the repo, etc.
}
}