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>();
    }