2012-03-22 2 views
9

У меня есть два проекта в моем решении ... проект домена и веб-проект MVC3 (например, MyApp.Domain и MyApp.Web). Ранее при использовании Ninject.Extensions.Conventions ver. 2, я смог использовать следующий оператор в файле NinjectMVC3.cs, и требуемые зависимости во всем моем решении (как в Интернете, так и в домене) были правильно введены (например, IFoo автоматически привязан к Foo).Инъекция на основе зависимостей от применения с Ninject 3.0.0

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

Я просто повышен до Ninject 3.0.0 (пре-релиз) и Ninject.Extensions.Conventions 3.0.0 (другой предварительный релиз), но синтаксис конвенции на основе связывания изменилась. Я понял, что могу использовать следующий оператор с новой версией, но он только автоматически связывает интерфейсы на основе соглашений в MyApp.Web, а не в MyApp.Domain. Интерфейс, связанный с предыдущей версией, используется во всем приложении.

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

Любая подсказка, как я могу настроить привязку на основе соглашения с новой версией Ninject? Я предполагаю, что это связано с указанием сборки, но я пробовал использовать FromAssembliesMatching("*"), и это не все.

- Изменить, чтобы показать свой код в существующее место метод 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

Вы смотрели на [вики] (https: // GitHub .com/Ninject/ninject.extensions.conventions/вики). Если нет, можете ли вы дать представление о том, какой бит не имеет для вас смысла? –

+0

Рубен, я посмотрел на вики. Что не имеет смысла, так это то, что старый код 'x.FromAssembliesMatching (" * ")' работал и привязывал все мои интерфейсы в MyApp.Web и MyApp.Domain. Однако с новым 3.0.0 этот синтаксис не работает. Самое близкое, что я нашел, это 'x.FromThisAssembly()', но это только связывает интерфейсы в MyApp.Web (так как именно там происходит инъекция). Он не связывает автоматически интерфейсы в MyApp.Domain. – bigmac

+0

Глядя на код, вы всегда можете получить сборки самостоятельно (либо через список ассемблеров AppDomain, либо какой-то механизм opther) и явно указать список. Помимо этого я рекомендую jhust прочитать источник - его просто не большой. https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions/BindingBuilder/AssemblyFinder.cs –

ответ

17

эквивалент является:

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

Спасибо Remo. Наверное, я идиот. Это была одна из первых вещей, которые я пробовал, но я использовал метод BindToDefaultInterfaces (множественное число), который не удался.Когда я сменил его на сингулярный метод, он сработал. Извините за все сообщения, но я очень ценю вашу помощь. Отличная работа над всеми вашими проектами! – bigmac

Смежные вопросы