2

Ninject 자동 바인딩으로 벨로우즈 코드를 바인딩하는 것을 좋아합니다. 단일 프로젝트 내에서 수동 바인딩과 수동 바인딩을 모두 사용할 수 있습니까? let; s 수동 바인딩을 사용하여 벨로우즈를 가져오고, 자동 바인딩으로 달성하고 싶습니다. 이것을 달성하는 방법을 알려주십시오. IRepository < 모델>Ninject Conventions Extension을 사용하여 바인딩하는 방법?

3

벨로 기본 인터페이스로부터 상속 된 모든 인터페이스

  • kernel.Bind<IUnitOfWork<TestContext>>().To<UnitOfWork<TestContext>>();

    kernel.Bind<TestContext>().ToSelf().InRequestScope();

    1. . kernel.Bind<IUserRepository>().To<UserRepository>();

      4. kernel.Bind<IAccountRepository>().To<AccountRepository>();

      5. 추가 kernel.Bind<IMessageRepository>().To<MessageRepository>().WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey)

      나는 그것이 같은

      .Exclude<ARepository>() .Exclude<BRepository>() .Exclude<CRepository>()로 할 필요하면 내가 여러 클래스에 대한 .Exclude<MessageRepository>()를 작성해야합니까?

      및 1 & 2 별도의 수동 바인딩이 필요합니까? 또는 1은 BindToSelf()' and을 사용하여 수행 할 수 있습니다. 구성 (b => b.InRequestScope()) '?

    +0

    1. 및 2.에 대해서는 별도의 바인딩을 사용해야합니다. 이론적으로 컨벤션을 사용하여 전체 어셈블리의 모든 클래스를 기본 인터페이스로 바인딩하도록 말할 수는 있지만 중장기 적으로 이것은 구체적인 단일 바인딩을 지정하는 것보다 더 복잡한 작업을 유발할 수 있습니다. 또한 기존 바인딩을 여러 개 사용할 수 있습니다. – BatteryBackupUnit

    답변

    5

    예, 같은 모듈에서도 동일한 프로젝트에서 규칙 바인딩과 단일 바인딩을 사용할 수 있습니다.

    IBindingRoot.Bind(x => x 
        .FromThisAssembly() 
        .IncludingNonePublicTypes() 
        .SelectAllClasses() 
        .InheritedFrom(typeof(IRepository<>)) 
        .BindDefaultInterface() 
        .Configure(y => y.InRequestScope())); 
    

    그러나 특정 클래스에 생성자 인수를 전달할 수 없습니다. 그래서 구성에 대한 액세스를 래핑하는 인터페이스로 생성자 인수를 대체하는 것이 좋습니다. (어쨌든 멋진 디자인입니다.)

    또는 당신은 또한이 작업을 수행 할 수 있습니다

    IBindingRoot.Bind(x => x 
        .FromThisAssembly() 
        .IncludingNonePublicTypes() 
        .SelectAllClasses() 
        .InheritedFrom(typeof(IRepository<>)) 
        .Exclude<MessageRepository>() 
        .BindDefaultInterface() 
        .Configure(y => y.InRequestScope())); 
    
    IBindingRoot.Bind<IMessageRepository>().To<MessageRepository>) 
        .WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey) 
        .InRequestScope(); 
    

    -> 당신이 할 수있는 일 .Exclude<TRepository>() 바인딩 규칙이 충분하지 모든 저장소를 위해. 모든 배제 된 바인딩에 대해 당신은 당신 자신을 명시해야 할 것입니다. 위와 같이 : IRepository<>을 구현하는 모든 클래스에 대한 조건부 바인딩 클래스 MessageRepository은 자체 바인딩을 갖습니다.

    또한 이것 좀 봐 : https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind

    부록 : 당신은 예를 들어, 여러 기존의 바인딩을 지정할 수 있습니다 :

    IBindingRoot.Bind(x => x 
        .FromThisAssembly() 
        .SelectAllClasses() 
        .InheritedFrom(typeof(IFoo)) 
        .BindDefaultInterface() 
        .Configure(y => y.InRequestScope())); 
    
    
    IBindingRoot.Bind(x => x 
        .FromThisAssembly() 
        .SelectAllClasses() 
        .InheritedFrom(typeof(IBar)) 
        .BindToSelf() 
        .Configure(y => y.InRequestScope())); 
    

    완전히 OK입니다.

    +0

    답장을 보내 주셔서 감사합니다. 문의 사항이 있으시면 연락해주십시오. –

    2

    예외가 거의없는 경우 이전 솔루션이 작동합니다.그것들이 더 있다면 당신은 많은 관습들로 끝날 것입니다.

    IBindingRoot.Rebind 메서드를 사용하면 이미 규칙에 적용되는 바인딩과 겹치는 바인딩을 재정의 할 수 있습니다.

    IBindingRoot.Bind(x => x 
    .FromThisAssembly() 
    .SelectAllClasses() 
    .BindAllInterface()); 
    
    IBindingRoot.Rebind<IMessageRepository>().To<MessageRepository>) 
    .WithConstructorArgument("apikey", AppSettingsManager.GetSmsApiKey) 
    .InRequestScope(); 
    
    관련 문제