2012-03-22 19 views
9

Tengo dos proyectos en mi solución ... un proyecto de dominio y un proyecto web MVC3 (por ejemplo, MyApp.Domain y MyApp.Web). Anteriormente, al usar Ninject.Extensions.Conventions ver. 2, pude usar la siguiente declaración en el archivo NinjectMVC3.cs, y las dependencias requeridas en toda mi solución (tanto web como de dominio) se inyectaron correctamente (por ejemplo, IFoo se vinculó automáticamente a Foo).Inyección de dependencias basada en convenciones con Ninject 3.0.0

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

acabo actualizado a 3.0.0 Ninject (pre-release) y Ninject.Extensions.Conventions 3.0.0 (otro pre-lanzamiento), pero la sintaxis de convención basada unión ha cambiado. He descubierto que puedo usar la siguiente declaración con la nueva versión, pero solo vincula automáticamente las interfaces basadas en la convención en MyApp.Web y no en MyApp.Domain. La versión anterior enlazó las interfaces en toda la aplicación.

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

¿Alguna pista sobre cómo puedo configurar el enlace basado en convenciones con la nueva versión de Ninject? Supongo que tiene que ver con especificar el ensamblaje, pero he intentado usar FromAssembliesMatching("*") y falla para todo entonces.

- Editar para mostrar mi código en el método exisiting 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

miraste [wiki] (https: // github .com/ninject/ninject.extensions.conventions/wiki). Si no, ¿puedes darme una idea de qué bit no tiene sentido para ti? –

+0

Ruben, he visto la wiki. Lo que no tiene sentido es que con el código anterior 'x.FromAssembliesMatching (" * ")' trabajó y vinculó todas mis interfaces en MyApp.Web y MyApp.Domain. Sin embargo, con la nueva 3.0.0, esa sintaxis no funciona. Lo más cerca que he encontrado es 'x.FromThisAssembly()', pero eso solo vincula las interfaces dentro de MyApp.Web (ya que ahí es donde tiene lugar la inyección). No vincula automáticamente las interfaces en MyApp.Domain. – bigmac

+0

Al mirar el código, siempre puede obtener los ensambles usted mismo (ya sea a través de la lista de ensamblajes de AppDomain o algún otro mecanismo) y proporcionar la lista explícitamente. Aparte de eso, recomiendo leer la fuente, simplemente no es grande. https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions/BindingBuilder/AssemblyFinder.cs –

Respuesta

17

El equivalente es:

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

Gracias Remo. Supongo que soy un idiota. Esa fue una de las primeras cosas que intenté, pero utilicé el método BindToDefaultInterfaces (plural) que falló.Cuando lo cambié al método singular, funcionó. Perdón por todas las publicaciones, pero agradezco mucho su ayuda. ¡Buen trabajo en todos tus proyectos! – bigmac

Cuestiones relacionadas