2016-10-23 5 views
3

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 메소드는 여전히 호출되지 않습니다. 완료 생성 된 오브젝트합니다 (ControllerAction가 처리 코드의 마지막 줄을)를 사용하는 경우

, 즉, 정말 Ninject에와 우리가 using 문을 얻을 같은 동작을 달성 할 수있는 방법이 있나요 그 객체의 Dispose 메소드가 호출됩니까?

+0

[InRequestScope] (https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope)가 작동해야합니다. 왜 당신을 위해 작동하지 않습니까? – Steven

+0

@Steven 'Dispose'메서드에 중단 점을 넣고 디버깅을 시작하면 해당 메서드가 호출되지 않습니다. 아마도'Controller' 라이프 사이클과 관련이 있거나 Ninject를 제대로 설정하지 않았을 것입니다. 주로 InRequestScope를 사용하는 방법이 명확하지 않기 때문입니다. – eddy

+0

@Steven @ NinjectWebCommon을 추가하기 위해 질문을 편집했습니다. 나는 아직도 내가 필요로하는 것을 얻지 못하고있다. – eddy

답변

관련 문제