2012-01-13 4 views
1

우선, 의존성 주입은 나에게 비교적 새로운 것이다. Unity.MVC3을 사용하여 첫 번째 프로젝트를 수행했으며 이제는 새로운 프로젝트에서 Ninject로 전환하고 싶습니다. 닷넷 프로젝트에 가장 많이 사용되는 의존성 인젝터 인 것 같습니다. 그래서 지금, 내 프로젝트에서 Ninject v2.2.1.4를 Ninject.MVC3 v2.2.2.0과 함께 사용하려고합니다. 내 이전 프로젝트에서Ninject 및 HierarchicalLifetimeManager가있는 ASP.Net MVC 3 프로젝트?

내가 유니티를 사용했다, 내 부트 스트 래퍼 클래스에 다음 코드 같은 것을했다 : 이제

private static IUnityContainer BuildUnityContainer() 
{ 
    var container = new UnityContainer(); 

    container.RegisterType<ITestService, TestService>();    
    container.RegisterType<IDatabaseFactory, DatabaseFactory>(new HierarchicalLifetimeManager()); 
    container.RegisterType<IUnitOfWork, UnitOfWork>(); 
    container.RegisterType<ILoggingService, LoggingService>(); 

    container.RegisterControllers(); 

    return container; 
} 

, 나는 나의 새로운 프로젝트는 다음 코드처럼 뭔가이 교체 NinjectMVC3 클래스 (App_Start) :

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ITestService>().To<TestService>(); 
    //This does not compile: 
    //kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(new HierarchicalLifetimeManager()); 
    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 
    kernel.Bind<ILoggingService>().To<LoggingService>(); 
} 

그러나, 나는 그것이 일반적으로 HierarchicalLifetimeManager의 사용을 필요로하기 때문에 내가의 DatabaseFactory 바인딩과 함께 무엇을해야하는지 모르겠어요. 누구나 제대로 DatabaseFactory 바인딩을 만드는 방법을 말해 줄 수 있습니까?

답변

0

우선, 다음 참조를 추가하여 호환 가능한 패키지 세트를 갖고 있는지 확인하십시오.

그런 다음 Ninject.Web.MVC를 추가하면 전원 셸 스크립트를 통해 프로젝트 초기화 코드가 설정됩니다.

마지막으로 BindModule 클래스를 이렇게 만들고 두 번째 단계에서 만든 CreateKernel 메서드의 모듈에 추가하십시오. Ninjet 각 개체에 대해 서로 다른 수명주기를 돌봐 기능이 내장되어 위의 당신이 볼 수 있듯이 NinjectMVC3 클래스

public static class NinjectMVC3 
{ 
    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var modules = new NinjectModule[] { new BindModule() }; 
     var kernel = new StandardKernel(modules); 

     RegisterServices(kernel); 

     return kernel; 
    } 
} 

public class BindModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IControllerActivator>().To<CustomControllerActivator>().InRequestScope(); 
     this.Bind<MembaseClient>().ToMethod(context => new MembaseClient()).InSingletonScope(); 
     this.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
     this.Bind<ISessionFactory>().ToMethod(o => MyAutoMapper.sessionFactory).InSingletonScope(); 
     this.Bind<ISession>().ToMethod(o => MyAutoMapper.sessionFactory.OpenSession()).InRequestScope(); 
     } 
    } 

부.

+0

코드 샘플 및 설명을 보내 주셔서 감사합니다. 사실을 말하면, 나는 여전히 ASP.Net MVC와이 모든 패턴에 대해 많은 것을 배워야 만합니다. 나는 Nuget의 최신 패키지를 사용하고 있으므로 버전이 좋을 것입니다. BindModule.Load 재정의를 사용하는 것과 Ninject.MVC3에서 제공하는 NinjectMVC3 클래스에서 제공되는 RegisterServices() 메서드를 사용하는 것 사이에 차이가 있습니까? 그런데 MVC3 용 Ninject.Web.MVC 패키지는 없습니다. –

+0

또한 HierarchicalLifetimeManager가 무엇인지 완전히 이해하지 못했습니다. MVC에 대해 배울 샘플 프로젝트에서 가져 왔습니다. Ninject를 사용할 때 대체해야 할 내용을 말씀해 주시겠습니까? –

+0

나는 더 큰 차이가 없다는 것을 제외하고는 더 모듈화되어 있고 많은 프로젝트를 가지고 있다면 그들 자신의 NinjectModule AFAIK를 가질 수 있지만 두 번째 질문에 대답하기 위해 나는 알 수 없다.하지만 그것은 평생 동안해야 할 일이다 위의 예제를 Singleton, InRequestScope, InThreadScope와 같이 볼 수 있습니다. –