Как настроить 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
метод этого объекта называется?