MVC5 응용 프로그램에 Ninject를 사용하려고하는데 구성 할 수있는 방법이 있는지 알고 싶습니다. Controller
(단일 인스턴스) 컨트롤러마다 Action
에서 해당 인스턴스를 사용하고 오브젝트가 사용하는 모든 리소스를 해제 한 후에 Action
이 완료되면 해당 인스턴스를 사용하십시오.Ninject를 구성하여 컨트롤러 당 하나의 인스턴스를 생성하는 방법
Ninject가 내 컨트롤러에 주입하기를 원하는 클래스는 IDisposable 인터페이스를 구현합니다.
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>();
}
을하지만 Dispose
방법은 결코 호출되지 가져옵니다
은 지금까지 나는이 시도했다. 나는 또한 InRequestScope
을 시도했지만 역시 작동하지 않았다.
지금까지 실제로 작동 한 유일한 것은 각 컨트롤러의 Action
에있는 using
문에서 필요한 개체의 인스턴스화를 래핑하는 것입니다. 이 같은
뭔가 :
using (var uow = UnitOfWorkFactory.Create())
{
var repos = new UserRepository(uow);
uow.SaveChanges();
}
편집 :
위의 코드에서 볼 수 있듯이
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();
}
}
는 지금 '는 Ninject에 패키지가 추가 된 NinjectWebCommon 클래스 m을 kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
을 사용하지만, 내 클래스의 Dispose
메소드는 여전히 호출되지 않습니다. 완료 생성 된 오브젝트합니다 (Controller
의 Action
가 처리 코드의 마지막 줄을)를 사용하는 경우
using
문을 얻을 같은 동작을 달성 할 수있는 방법이 있나요 그 객체의
Dispose
메소드가 호출됩니까?
[InRequestScope] (https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope)가 작동해야합니다. 왜 당신을 위해 작동하지 않습니까? – Steven
@Steven 'Dispose'메서드에 중단 점을 넣고 디버깅을 시작하면 해당 메서드가 호출되지 않습니다. 아마도'Controller' 라이프 사이클과 관련이 있거나 Ninject를 제대로 설정하지 않았을 것입니다. 주로 InRequestScope를 사용하는 방법이 명확하지 않기 때문입니다. – eddy
@Steven @ NinjectWebCommon을 추가하기 위해 질문을 편집했습니다. 나는 아직도 내가 필요로하는 것을 얻지 못하고있다. – eddy