Ninject.MVC3, Nuget, WebActivator о мой - PullRequest
       65

Ninject.MVC3, Nuget, WebActivator о мой

14 голосов
/ 15 марта 2011

Я хочу настроить Ninject для проведения простого теста, а также продемонстрировать простоту настройки с помощью Nuget. Я хочу разрешить образец сервиса.

public interface ITestService
{
    string GetMessage();
}
public class TestService : ITestService 
{
    public string GetMessage() { return "hello world"; }
}

Я запускаю установочный пакет NuGet 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.

Благодарность за помощь »

** * * * * * * * * * * * Обновление: * * * * * * * * * * * * * * * * **

Спасибо за отличные отзывы о внедрении контроллера-конструктора. Просто добавив конструктор с ITestServcice в качестве параметра .... БАММ !!!

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 создает ядро, но не содержит и не предоставляет ссылку на него, а также я не могу найти очевидный класс / метод для «получения ядра».

Я предполагаю, что ты - Неверный способ получить его, но не уверен.

** * * * * * * * * * * * (Финал) Обновление: * * * * * * * * * * * * * * * * **

Еще раз спасибо за ответы и комментарии ....

Исправление: класс NinjectMVC3 создает ядро ​​и содержит ссылку на «Bootstrapper», который в нем является IKernel.

Поэтому я добавил метод 'resolve' в класс 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>();
   }
}

Ответы [ 2 ]

16 голосов
/ 15 марта 2011

Шаги:

  1. Создание нового проекта ASP.NET MVC 3
  2. Установите пакет NuGet из консоли пакетов: Install-Package Ninject.MVC3
  3. В HomeController:

    public class HomeController : Controller
    {
        private readonly ITestService _service;
        public HomeController(ITestService service)
        {
            _service = service;
        }
    
        public ActionResult Index()
        {
            ViewBag.Message = _service.GetMessage();
            return View();
        }
    }
    
  4. В App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
4 голосов
/ 15 марта 2011

Добавьте 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 (), чтобы получить экземпляр:

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 .

...