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