Использование Ninject и Ninject.Extensions.Conventions с указанными сборками

Я пытаюсь настроить Ninject для проекта ASP.NET MVC 4.

У меня есть 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, то все зависимости будут разрешены, и все будет работать правильно.


person Simon Lomax    schedule 03.12.2013    source источник


Ответы (1)


Вы можете иметь только одно выражение 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());
person nemesv    schedule 03.12.2013
comment
Спасибо, я бы никогда не подумал об этом. - person Simon Lomax; 03.12.2013
comment
Я тоже, для меня тоже было не очевидно, в чем проблема. На сайте расширения github нет сложного примера... Мне пришлось искать источник, чтобы проверить, что пошло не так. - person nemesv; 03.12.2013