2012-03-22 18 views
9

Mam dwa projekty w moim rozwiązaniu ... projekt domeny i projekt internetowy MVC3 (np. MyApp.Domain i MyApp.Web). Poprzednio podczas korzystania z Ninject.Extensions.Conventions ver. 2, udało mi się użyć poniższej instrukcji w pliku NinjectMVC3.cs, a wymagane zależności w całym rozwiązaniu (zarówno w sieci, jak i w domenie) zostały odpowiednio wstrzyknięte (np. IFoo automatycznie powiązano z Foo).Konwencjonalny wtrysk zależności z Ninject 3.0.0

kernel.Scan(x => 
{ 
    x.FromAssembliesMatching("*"); 
    x.BindWith<DefaultBindingGenerator>(); 
}); 

właśnie uaktualniony do Ninject 3.0.0 (pre-release) i Ninject.Extensions.Conventions 3.0.0 (inna pre-release), ale składnia konwencji opiera wiązania się zmieniło. Stwierdziłem, że mogę użyć poniższego oświadczenia w nowej wersji, ale automatycznie wiąże on tylko interfejsy oparte na konwencjach w MyApp.Web, a nie w MyApp.Domain. Poprzednia wersja ograniczała interfejsy w całej aplikacji.

kernel.Bind(x => x 
    .FromThisAssembly() 
    .SelectAllClasses() 
    .BindToAllInterfaces()); 

Jakąkolwiek wskazówkę, jak skonfigurować powiązanie oparte na konwencjach z nową wersją programu Ninject? Zakładam, że ma to związek z określeniem złożenia, ale próbowałem używać FromAssembliesMatching("*"), a to wszystko zawodzi.

- Edycja, aby pokazać mój kod objąć istniejącymi w metodzie RegisterServices: -

private static void RegisterServices(IKernel kernel) 
{ 
    // This code used to work with v.2 of Ninject.Extensions.Conventions 
    // kernel.Scan(x => 
    // { 
    // x.FromAssembliesMatching("*"); 
    // x.BindWith<DefaultBindingGenerator>(); 
    // }); 

    // This is the new v3 code that automatically injects dependencies but only for interfaces in MyApp.Web, not MyApp.Domain 
    kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().BindToAllInterfaces()); 

    // I tried this code, but it throws "Error activating IDependencyResolver" at "bootstrapper.Initialize(CreateKernel)" 
    // kernel.Bind(x => x.FromAssembliesInPath(AppDomain.CurrentDomain.RelativeSearchPath).SelectAllClasses().BindToAllInterfaces()); 

    // These are dependencies in MyApp.Web that ARE being bound properly by the current configuration 
    // kernel.Bind<IMemberQueries>().To<MemberQueries>(); 
    // kernel.Bind<IGrantApplicationQueries>().To<GrantApplicationQueries>(); 
    // kernel.Bind<IMailController>().To<MailController>(); 

    // These are dependencies in MyApp.Domain that ARE NOT being bound properly by the current configuration, so I have to declare them manually 
    // They used to be injected automatically with version 2 of the conventions extention 
    kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
    kernel.Bind<IMemberServices>().To<MemberServices>(); 
    kernel.Bind<IGrantApplicationServices>().To<GrantApplicationServices>(); 

    // These are dependencies that SHOULD NOT be bound by convention as they require a different scope or have unique naming 
    kernel.Bind(typeof(EfDbContext)).ToSelf().InRequestScope(); 
    kernel.Bind<IConfigurationProvider>().To<WebConfigConfigurationProvider>().InSingletonScope(); 
    kernel.Bind<IAuthorizationProvider>().To<MyAppAuthorizationProvider>(); 
    kernel.Bind<IPrincipal>().ToMethod(ctx => HttpContext.Current.User).InRequestScope(); 
    kernel.Bind<IGrantApplicationDocumentServices>().To<MySpecialNameGrantAplicationDocumentServices>().InRequestScope(); 
} 
+0

spojrzał na [wiki] (https: // github .com/ninject/ninject.extensions.conventions/wiki). Jeśli nie, czy możesz powiedzieć, który kawałek nie ma dla ciebie sensu? –

+0

Ruben, zajrzałem na wiki. Nie ma sensu, że ze starym kodem 'x.FromAssembliesMatching (" * ")' pracował i łączył wszystkie moje interfejsy w MyApp.Web i MyApp.Domain. Jednak w nowym 3.0.0 ta składnia nie działa. Najbliższe, co znalazłem, to 'x.FromThisAssembly()', ale to tylko wiąże interfejsy w MyApp.Web (ponieważ tam właśnie ma miejsce iniekcja). Nie wiąże automatycznie interfejsów MyApp.Domain. – bigmac

+0

Patrząc na kod, zawsze można uzyskać złożeń samodzielnie (za pośrednictwem listy zespołów AppDomain lub niektórych mechanizmów opther) i podać listę jawnie. Poza tym polecam jhust czytanie źródła - jego po prostu nie jest duże. https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions/BindingBuilder/AssemblyFinder.cs –

Odpowiedz

17

Odpowiednikiem jest:

kernel.Bind(x => x 
    .FromAssembliesMatching("*") 
    .SelectAllClasses() 
    .BindDefaultInterface()); 
+1

Dzięki Remo. Chyba jestem kretynem. To była jedna z pierwszych rzeczy, które próbowałem, ale użyłem metody BindToDefaultInterfaces (liczba mnoga), która się nie powiodła.Kiedy zmieniłem go na metodę pojedynczą, zadziałało. Przepraszamy za wszystkie posty, ale bardzo dziękuję za pomoc. Świetna praca nad wszystkimi Twoimi projektami! – bigmac

Powiązane problemy