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();
}
miraste [wiki] (https: // github .com/ninject/ninject.extensions.conventions/wiki). Si no, ¿puedes darme una idea de qué bit no tiene sentido para ti? –
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
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 –