Я бы сказал, что ты определенно должен. Если Entity Framework не обрабатывает соединения совсем иначе, чем LinqToSql (что я и использовал), вы должны реализовать IDisposable
всякий раз, когда работаете с соединениями. Может быть верно, что соединение автоматически закрывается после успешного завершения вашей транзакции. Но что произойдет, если он не завершится успешно? Реализация IDisposable
является хорошей гарантией того, что после того, как вы поработаете с ними, у вас не останется открытых соединений. Более простая причина заключается в том, что рекомендуется применять IDisposable
.
.
Реализация может быть такой же простой, как если бы вы поместили это в свой класс репозитория:
public void Dispose()
{
SqlDataContext.Dispose();
}
Затем, когда вы что-либо делаете со своим репозиторием (например, со своим сервисным уровнем), вам просто нужно обернуть все в предложение using
. Вы также можете выполнить несколько операций «CRUD» в одном предложении using
, поэтому вы можете распоряжаться им только тогда, когда закончите.
Обновление
В моем слое обслуживания (который я разработал для работы с LinqToSql, но, надеюсь, это применимо к вашей ситуации), я делаю каждый раз при создании нового хранилища. Чтобы обеспечить возможность тестирования, у меня есть проход инжектора зависимости в репозитории provider (вместо экземпляра репозитория). Каждый раз, когда мне нужен новый репозиторий, я заключаю вызов в оператор using
, например:
using (var repository = GetNewRepository())
{
...
}
public Repository<TDataContext, TEntity> GetNewRepository()
{
return _repositoryProvider.GetNew<TDataContext, TEntity>();
}
Если вы сделаете это таким образом, вы можете смоделировать все (чтобы вы могли проверить свой уровень обслуживания в изоляции), но при этом убедиться, что вы правильно утилизируете свои соединения.
Если вам действительно нужно выполнить несколько операций с одним репозиторием, вы можете поместить что-то вроде этого в базовый класс обслуживания:
public void ExecuteAndSave(Action<Repository<TDataContext, TEntity>> action)
{
using (var repository = GetNewRepository())
{
action(repository);
repository.Save();
}
}
action
может быть серией действий CRUD или сложным запросом, но вы знаете, если вы позвоните ExecuteAndSave()
, когда все это будет сделано, ваше хранилище будет правильно расположено.