Я совершенно новичок в рамках IoC, поэтому, пожалуйста, извините за терминологию.
Итак, у меня есть проект MVC с ссылками Nininject MVC.
У меня есть другие классы в моем проекте, например. Уровень домена, я хотел бы иметь возможность использовать инфраструктуру Ninject, но все мои привязки находятся в NinjectWebCommon.cs
в папке App_Start
в проекте MVC:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHardwareService>().To<WindowsHardwareService>();
kernel.Bind<IStatusApi>().To<StatusApiController>();
}
В настоящее время в моей библиотеке классов я использую инъекцию конструктора, но иногда мне приходится жестко кодировать зависимости:
var service = new WindowsHardwareService();
Когда я хотел бы иметь возможность сделать следующее:
IKernel kernel = new StandardKernel(.....);
var context = kernel.Get<IHardwareService>();
Я не делал следующее, потому что у меня нет модулей? Вся документация, которую я прочитал, в основном направлена на обычную библиотеку Ninject, а не на версию MVC.
Что мне нужно делать, и как я могу использовать обычную библиотеку Ninject с версией MVC?
Обновление
Вот что я пробовал:
Цель этого заключается в том, чтобы каждый проект мог загрузить модуль и получить текущий инъецируемый интерфейс.
App_Start/NinjectWebCommon.cs (в проекте MVC)
private static void RegisterServices(IKernel kernel)
{
var modules = new IoCModules();
var newKernal = modules.GetKernel();
kernel = newKernal;
}
IoCModules.cs (в проекте Project.Ioc)
public class IoCModules
{
public IKernel GetKernel()
{
var modules = new CoreModule();
return modules.Kernel;
}
}
CoreModule.cs (в проекте Project.IoC.Modules) < - Здесь все ссылки на все проекты, это обойти любые проблемы с круговой зависимостью.
public class CoreModule : NinjectModule
{
public override void Load()
{
Bind<IHardwareService>().To<WindowsHardwareService>();
Bind<IStatusApi>().To<StatusApiController>();
}
}
Но в настоящее время я получаю следующее:
Ошибка активации IHardwareService
Нет соответствующих привязок, и тип не является самопереключаемым. Путь активации:
2) Инъекция зависимости IHardwareService в службу параметров конструктора типа DashboardController
1) Запрос DashboardController
Предложения:
1) Убедитесь, что вы определили привязку для IHardwareService.
2) Если привязка была определена в модуле, убедитесь, что модуль загружен в ядро.
3) Убедитесь, что вы случайно не создали несколько ядер.
4) Если вы используете аргументы конструктора, убедитесь, что имя параметра совпадает с именем параметра конструктора.
5) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры правильные.