2013-12-03 2 views
2

Я пытаюсь получить Ninject с проектом ASP.NET MVC 4.Использование Ninject и Ninject.Extensions.Conventions с ссылочными сборками

У меня есть 3 проекта в моем решении. Основное веб-приложение MVC 4, содержащее ссылки на 2 несущие сборки (My.Services.dll и My.Repository.dll). My.Services.dll также имеет ссылку на My.Repository.dll.

Я добавил пакеты NuGet: Ninject.MVC3 (версия 3.0.0.6) и Ninject.Extensions.Conventions (версия 3.0.0.11)

В главном веб-приложения у меня есть Home controller со следующим конструктором

public HomeController(IMyService myService) 
{ 
    _myService = myService; 
} 

служба имеет конструктор типа так:

public MyService(IMyRepository myRepository) 
{ 
    _myRepository = myRepository; 
} 

В моем NinjectWebCommon файле у меня есть:

private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind(x => 
      { 
       x.FromThisAssembly().SelectAllClasses().BindDefaultInterface(); 
       //x.FromAssemblyContaining<MyRepository>().SelectAllClasses().BindDefaultInterface(); 
       //x.FromAssemblyContaining<MyService>().SelectAllClasses().BindDefaultInterface(); 
       x.From("My.Repository", "My.Services").SelectAllTypes().BindDefaultInterface(); 

      }); 
     }   

При запуске приложения я получаю сообщение об ошибке ("Value cannot be null.\r\nParameter name: first") на последнюю строку методы RegisterServices.

Вы можете видеть в коде, который я также пробовал x.FromAssemblyContaining<MyRepository>().SelectAllClasses().BindDefaultInterface(), безрезультатно.

Кстати, если я помещаю 2 типа, MyService и MyRepository в веб-приложение, а не в спутниковые сборки и удаляю последнюю строку RegisterServices, тогда все зависимости разрешаются, и все работает правильно.

ответ

3

Вы можете иметь только один From... выражение внутри в kernel.Bind вызова.

Так называют ваши FromAssemblyContaining в разные kernel.Bind заявления, и он должен работать нормально:

kernel.Bind(x => x.FromThisAssembly() 
        .SelectAllClasses().BindDefaultInterface()); 
kernel.Bind(x => x.FromAssemblyContaining<MyRepository>() 
        .SelectAllClasses().BindDefaultInterface()); 
kernel.Bind(x => x.FromAssemblyContaining<MyService>() 
        .SelectAllClasses().BindDefaultInterface()); 
+0

Спасибо, я никогда бы не подумал об этом. –

+0

Мне тоже, для меня также не было очевидным, в чем проблема. На сайте github расширения нет никакого сложного примера ... Мне пришлось искать источник, чтобы проверить, что пошло не так. – nemesv

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