Как настроить Ninject, чтобы он создавал один экземпляр для каждого контроллера

Я пытаюсь использовать Ninject для приложения MVC5, и я хочу знать, могу ли я каким-либо образом настроить его, чтобы создать экземпляр одного объекта дляController (Я не уверен, что это так же, как в запросе), используйте этот экземпляр в любомAction контроллера и однаждыAction закончила освобождение всех ресурсов, которые использовал объект.

Класс, который я хочу внедрить в мои контроллеры Ninject, реализует интерфейс IDisposable.

Пока я пробовал это:

  private static void RegisterServices(IKernel kernel)
  {
     kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>();
  }

НоDispose метод никогда не вызывается. Я тоже пробовалInRequestScope, но это тоже не сработало.

Пока единственное, что на самом деле сработало, - это завершение создания экземпляра объекта, который мне нужен, вusing выписка в КАЖДОМ контроллереAction.

Что-то вроде этого:

using (var uow = UnitOfWorkFactory.Create())
{
  var repos = new UserRepository(uow);

  uow.SaveChanges();
}
РЕДАКТИРОВАТЬ:

Класс NinjectWebCommon, добавленный пакетом Ninject

 public static class NinjectWebCommon
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start()
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
        }
    }

Как вы можете видеть из кода выше, сейчас я используюkernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();, ноDispose метод моего класса до сих пор никогда не вызывается.

Есть ли способ достичь с помощью Ninject того же поведения, которое мы получаем сusing оператор, то есть когда созданный объект используется (последняя строка кода вController«sAction обрабатывается)Dispose метод этого объекта называется?

Ответы на вопрос(1)

Ваш ответ на вопрос