Как избавиться от DbContext (или объекта) в приложении asp.net mvc3, когда Ninject используется как средство разрешения зависимостей - PullRequest
4 голосов
/ 19 октября 2011

Для этой демонстрации я создал поддельный репозиторий базы данных +, как показано ниже

Поддельный дб + репозиторий

 public interface IDemoRepository
    {
        string[] GetUsers();
    }

    public class DemoRepository : IDemoRepository, IDisposable
    {

        public string[] GetUsers()
        {
            string[] Users = { "Robert","Linda","Jack"};
            return Users;
        }

        public void Dispose()
        {
            //do nothing     
            throw new Exception("Disposed is called");       
        }
    }

Мой контроллер выглядит следующим образом

 public class TestController:Controller
    {
        protected IDemoRepository _repository;

        public BaseController(IDemoRepository repository)
        {
            _repository = repository;
        }

        public ActionResult()
       {  
             var users = _repository.GetUsers();
             Return View(users);
       }
    }

Ninject Part

Я установил ninject из NUGet и добавил приведенный ниже код для разрешения хранилищ

kernel.Bind<IDemoRepository>().To<DemoRepository>()

Ninject не вызывает DemoRepository.Dispose, я добавил точку останова, даже мой текущий код выдает ошибку, но Ninject этоне звонит DemoRepository.Dispose.

Может ли какой-либо орган подсказать мне, как распоряжаться объектом.

Ответы [ 2 ]

5 голосов
/ 19 октября 2011

Убедитесь, что ваш репозиторий привязан к области запроса в Ninject, если вы хотите, чтобы он был удален:

kernel.Bind<IDemoRepository>().To<DemoRepository>().InRequestScope();
1 голос
/ 19 октября 2011

Вам не нужно Dispose() из вас DbContext, так как он уже сам должным образом управляет всеми соединениями. Вот цитата из ASP.NET MVC Совет № 34. Утилизируйте свой DataContext (или не делайте) :

Наиболее важным следствием вызова метода DataContext.Dispose () является то, что все открытые соединения, связанные с DataContext, закрываются. Это может показаться очень важным, но это не так. Причина, по которой это не важно, заключается в том, что класс DataContext уже управляет своими соединениями. По умолчанию класс DataContext открывает и закрывает соединение автоматически.

...

Чаще всего при вызове метода Dispose () объекта DataContext любое соединение с базой данных, связанное с объектом DataContext, уже закрыто. Объект DataContext закрыл соединение с базой данных сразу после выполнения запроса к базе данных. Таким образом, метод Dispose () действительно не имеет ничего общего.

...