2012-03-22 13 views
9

Ho due progetti in mia soluzione ... un progetto di dominio e di progetto web MVC3 (ad esempio MyApp.Domain e MyApp.Web). In precedenza, quando si utilizzava Ninject.Extensions.Conventions ver. 2, sono stato in grado di utilizzare la seguente istruzione nel file NinjectMVC3.cs e le dipendenze richieste in tutta la mia soluzione (sia web che dominio) sono state iniettate correttamente (ad esempio IFoo si è associato automaticamente a Foo).convenzione basata Dependency Injection con Ninject 3.0.0

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

Ho appena aggiornato a 3.0.0 Ninject (pre-release) e Ninject.Extensions.Conventions 3.0.0 (un altro pre-release), ma la sintassi per convenzione basata vincolante è cambiato. Ho capito che posso usare la seguente dichiarazione con la nuova versione, ma lega automaticamente solo le interfacce basate su convenzione in MyApp.Web e non in MyApp.Domain. La versione precedente collegava le interfacce in tutta l'applicazione.

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

Qualche idea su come configurare l'associazione basata sulla convenzione con la nuova versione di Ninject? Presumo che abbia a che fare con la specifica dell'assembly, ma ho provato a utilizzare FromAssembliesMatching("*") e non riesce per tutto poi.

- Modifica per mostrare il mio codice exisiting nel metodo 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

hai guardato [wiki] (https: // GitHub .com/Ninject/ninject.extensions.conventions/wiki). In caso contrario, puoi dare qualche idea di quale bit non ha senso per te? –

+0

Ruben, ho guardato il wiki. Ciò che non ha senso è che con il vecchio codice 'x.FromAssembliesMatching (" * ")' ha funzionato e associato tutte le mie interfacce in MyApp.Web e MyApp.Domain. Tuttavia, con la nuova 3.0.0, questa sintassi non funziona. Il più vicino che ho trovato è 'x.FromThisAssembly()' ma che lega solo le interfacce all'interno di MyApp.Web (poiché è lì che avviene l'iniezione). Non associa automaticamente le interfacce in MyApp.Domain. – bigmac

+0

Guardando il codice, è possibile ottenere gli assembly da soli (tramite l'elenco di assiemi di AppDomain o qualche meccanismo opzionale) e fornire esplicitamente l'elenco. A parte questo, raccomando di leggere la fonte - non è molto grande. https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions/BindingBuilder/AssemblyFinder.cs –

risposta

17

L'equivalente è:

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

Grazie Remo. Credo di essere un idiota. Questa è stata una delle prime cose che ho provato, ma ho usato il metodo BindToDefaultInterfaces (plurale) che non è riuscito.Quando ho cambiato il metodo singolare, ha funzionato. Ci scusiamo per tutti i post, ma apprezzo molto il tuo aiuto. Ottimo lavoro su tutti i tuoi progetti! – bigmac

Problemi correlati