Да, вы должны утилизировать ваш DbContext в методе Dipose базового контроллера.В противном случае, никто не знает, что нужно утилизировать.В конечном итоге он может быть завершен через некоторое время после завершения запроса, но до тех пор, пока это не произойдет, базовое соединение с базой данных останется открытым и недоступным, что означает, что вы быстрее исчерпаете свой пул соединений.
Чтобы это произошло, вы, вероятно,не хотите, чтобы ваше свойство _db (которое, вероятно, должно быть переименовано в Db, или даже лучше DataContext, поскольку имена свойств в .Net обычно не начинаются с _), имеет защищенный установщик;подкласс может изменить значение свойства, и исходный контекст, который был там, был бы потерян без утилизации.
Что касается хранилища, то существует норма, что если у класса есть поле, которое является IDisposable,Вы должны также реализовать IDisposable в этом классе.В этом случае я бы, вероятно, изменил ваш IAsyncRepository<T>
, чтобы он также требовал реализации IDisposable.Тогда ваша реализация хранилища должна располагать DbConext, а ваш контроллер вместо этого должен располагать экземпляром хранилища.Вероятно, в этом случае также было бы лучше, если бы контроллер не сохранял никаких ссылок на DbContext, а просто предоставлял вместо этого экземпляр репозитория.
Подробнее о том, как правильно реализовать IDisposable, можно прочитать здесь https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose?view=netframework-4.7.2