Инъекция зависимостей на основе соглашения с Ninject 3.0.0 - PullRequest
9 голосов
/ 22 марта 2012

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

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

1 Ответ

17 голосов
/ 26 марта 2012

Эквивалент:

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