Ninject.MVC3, Nuget, WebActivator oh my
Я хочу настроить Ninject на простой тест, а также продемонстрировать легкость настройки с помощью Nuget. Я хочу разрешить образец сервиса.
public interface ITestService
{
string GetMessage();
}
public class TestService : ITestService
{
public string GetMessage() { return "hello world"; }
}
Я запускаю NuGet Install-Package NinjectMVC3.... он красиво бросает NinjectMVC3.cs в мою папку App_Start, украшенную некоторыми атрибутами WebActivator, чтобы загрузить все.
Далее я добавляю свое привязку в методе NinjectMVC3.RegisterServices:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITestService>().To<TestServiceOne>();
}
Теперь я хочу использовать "Ninjet" для решения моей службы ITestService.
public ActionResult Index()
{
//[Ninject, give me the service I need]
ITestService service = ???
ViewBag.Message = service.GetMessage();
return View();
}
Есть ли другая часть для настройки Ninject?
Должен ли я предоставить разрешение?
Какой код мне нужен для решения моей службы ITestService.
helpasking help "
** * * * * * * * * * * * Обновление: * * * * * * * * * * * * * * * * **
Благодарим вас за отличные ответы, касающиеся "конструктора контроллера".
Просто добавление конструктора с ITestServcice в качестве параметра.... BAMM!!!
private ITestService _service;
public HomeController(ITestService service)
{
_service = service
}
public ActionResult Index()
{
ViewBag.Message = _service.GetMessage();
return View();
}
Теперь, каково идеальное решение, когда мне нужно напрямую получить Ядро.
var kernel = ... // Go grab the kernel from ????? (thanks Judah).
ITestService service = kernel.Get<ITestService>();
Я вижу, что класс NinjectMVC3 создает Ядро, но не содержит или не ссылается на него, и я не могу найти очевидный класс/метод для "получения ядра".
Я предполагаю, что он является способом Ninject для его получения, но не уверен.
** * * * * * * * * * * * (Final) Обновление: * * * * * * * * * * * * * * * * **
Еще раз спасибо за ответы и комментарии....
Коррекция: класс NinjectMVC3 создает ядро и ссылается на "Bootstrapper", который как IKernel на нем.
Итак, я добавил метод "разрешить" в класс App_Start/NinjectMVC3... отлично работает.
public static class NinjectMVC3 /// created by the NinjectMVC3 NuGet Packagae
{
// add method to provide a global resolver.
public static T Resolve<T>()
{
return bootstrapper.Kernel.Get<T>();
}
}
Ответы
Ответ 1
Добавьте ITestService в качестве параметра конструктора к вашему контроллеру:
private ITestService service;
public MyController(ITestService service)
{
this.service = service;
}
public ActionResult Index()
{
ViewBag.Message = this.service.GetMessage();
return View();
}
Ninject автоматически добавит ITestService в ваш контроллер. Затем используйте служебное поле внутри вашего метода Index.
В качестве альтернативы, если вы не хотите, чтобы Ninject вводил в ваш конструктор контроллера, вы можете поддерживать вокруг создаваемого ядра, а затем внутри вашего метода Index вы вызываете kernel.Get <ITestService> (), чтобы захватить экземпляр:
public ActionResult Index()
{
var kernel = ... // Go grab the kernel we created back in app startup.
ITestService service = kernel.Get<ITestService>();
ViewBag.Message = service.GetMessage();
return View();
}
Посмотрите Инъекция для инъекций Ninject для контроллеров в MVC3.
Ответ 2
Шаги:
- Создайте новый проект ASP.NET MVC 3
- Установите пакет NuGet из консоли пакета:
Install-Package Ninject.MVC3
-
В HomeController:
public class HomeController : Controller
{
private readonly ITestService _service;
public HomeController(ITestService service)
{
_service = service;
}
public ActionResult Index()
{
ViewBag.Message = _service.GetMessage();
return View();
}
}
-
В App_Start/NinjectMVC3.cs
:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITestService>().To<TestService>();
}