2015-12-12 6 views
1

У меня есть несколько проектов в Visual Studio с Ninject-Moduledefinition для каждой сборки. Это решение структурировано как «Луковая архитектура». Модули загружаются только в Проекты со ссылками на сборку.Установить область для модулей ниндзе в архитектуре лука

У меня есть эти слои

  • Repository
  • BusinessLayer
  • Web-интерфейс

На данный момент веб-UI - Layer не нужно ссылаться на хранилище, потому что Ninject-Moduleloader из списка BusinessLayer получает ссылки со ссылкой на Replaceitory-Moduleloader

My Repository-Layer не имеет ссылки на сборки ASP.Net. Поэтому я не могу установить рамки моих NinjectModules на «InRequestScope». Я пытаюсь теперь установить конфигурацию ModuleLoader в моем WebUI-слое, но модули репозитория еще не «InRequestScope»

private static void RegisterServices(IKernel kernel) {   
    kernel.Bind(i => i.From("*.dll") 
    .SelectAllClasses() 
    .BindDefaultInterface() 
    .Configure(x => x.InRequestScope())); 

    kernel.Load(new BusinessLayer.BusinessLayerModuleLoader()); 
    kernel.Load(new WebUIInjector()); 
} 
  1. Почему эта конфигурация не работает с модулями, нагружен BusinessLayerModuleLoader сам?
  2. - это первое утверждение, связывающее только конфигурацию, или оно уже загружает NinjectModules из всех сборок, найденных с помощью «* .dll»? В этом случае я бы не нужно второе утверждение «kernel.Load (новый BusinessLayer ...» правильно?

ответ

0

Первое утверждение (kernel.Bind(i => i.From(....));) является поиск все развернутые * .dll для типов, которые имеют соответствия интерфейса «соглашение по умолчанию», которое: Имя_файла заканчивается именем интерфейса (без ведущего I), например: «Foo -> IFoo», «Bar -> IBar», «SomeFoo: IFoo». не загружать любые модули.

Kernel.Load запускает метод нагрузка на NinjectModule который может добавить дополнительные привязки. предпочтительный альтернативы можно было бы использовать и kernel.Load<BusinessLayer.BusinessLayerModuleLoader>() назовите его BusinessLayerModule вместо BusinessLayerModuleLoader.

Чтобы загрузить все модули всех развертываемых DLL-серверов: kernel.Load("*.dll");. Для получения дополнительной информации о модулях и загрузки модулей см: https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel

Примечание: Если модуль был сделать Bind<IFoo>().To<Foo>() там будет 2 привязок для IFoo как конвенции уже bindined его. Это приведет к NinjectActivationException с сообщением ...more than one matching binding available....

Подсказка: вопрос о том, как параметризовать области применения, примененные в NinjectModule, был задан на SO раньше.

+0

thx! Не знаю точно, почему, но селектор «* .dll» не работал для меня. Мне пришлось изменить это на имя моего RepositoryDll. Кроме того, я пропустил пункт «IncludingNonePublicTypes» здесь. Теперь он работает отлично! спасибо – Weissvonnix