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();
}
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? –
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
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 –