Ninject.MVC3, Nuget, WebActivator, о боже

Я хочу настроить 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.

благодарю за помощь »

** * * * * * * * * * * * Обновлять: * * * * * * * * * * * * * * * * **

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

Я предполагаю, что это способ Ninject получить его, но не уверен.

** * * * * * * * * * * * (Окончательное) Обновление: * * * * * * * * * * * * * * * * * **

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

Исправление: класс 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>();
   }
}

person Rob    schedule 15.03.2011    source источник
comment
Это, конечно, вопрос мнения, но ваш статический метод NinjectMVC3.Resolve‹T› является примером антишаблона локатора сервисов. Вообще говоря, внедрение зависимостей должно быть подсказкой, а не спрашивать. Марк Зееманн обсуждает это в своем блоге, что может немного прояснить ситуацию. blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx   -  person Andy S    schedule 24.03.2011


Ответы (2)


Добавьте 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.

person Judah Gabriel Himango    schedule 15.03.2011

Шаги:

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

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

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
person Darin Dimitrov    schedule 15.03.2011
comment
Спасибо, кажется довольно прямолинейным. Теперь, что было бы хорошей практикой для хранения ядра? Использовать синглтон в качестве глобального хранилища? - person Rob; 15.03.2011