Frage

Ich möchte Ninject einrichten, um einen einfachen Test durchzuführen und die Einstellung von Nuget zu demonstrieren. Ich möchte einen Beispieldienst lösen.

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

Ich führe das Nuget Install-Package NinjectMVC3 aus .... Es fällt ninjectMvc3.cs gut in meinen app_start-Ordner, das mit einigen WebActivator-Attributen dekoriert ist, um alles beladen zu werden.

Als nächstes füge ich meine Bindung in die ninjectMVC3.registerservices -Methode hinzu:

private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<ITestService>().To<TestServiceOne>();
}

Jetzt möchte ich Ninjet verwenden, um meinen itestservice zu lösen.

public ActionResult Index()
{
  //[Ninject, give me the service I need]
  ITestService service = ??? 

  ViewBag.Message = service.GetMessage();
  return View();
}

Gibt es einen anderen Teil bei der Einrichtung von Ninject? Muss ich einen Resolver anbieten?

Was ist der Code, den ich benötige, um meinen itestservice zu beheben?

Vielen Dank an Hilfe »

** * * * * * * * * * * * Aktualisieren: * * * * * * * * * * * * * * * * **

Vielen Dank für die großartigen Antworten auf die Injektion von "Controller Constructor". Einfach einen Konstruktor mit dem itestServce als Param hinzuzufügen .... Bamm !!!

private ITestService _service;

public HomeController(ITestService service)
{
  _service = service
}
public ActionResult Index()
{
  ViewBag.Message = _service.GetMessage();
  return View();
}

Wofür ist nun die ideale Lösung, wenn ich den Kernel direkt bekommen muss?

var kernel = ... // Go grab the kernel from ????? (thanks Judah).
ITestService service = kernel.Get<ITestService>();

Ich kann sehen, dass die NinjectMVC3 -Klasse den Kernel erstellt, aber weder einen Hinweis darauf hält oder enthüllt, noch kann ich eine offensichtliche Klasse/Methode finden, um den Kernel zu erhalten.

Ich nehme an, Sie sind ein ninjektischer Weg, es zu bekommen, aber nicht sicher.

** * * * * * * * * * * * * (endgültig) update: * * * * * * * * * * * * * * * **

Nochmals vielen Dank für die Antworten und Kommentare ....

Korrektur: Die NinjectMVC3 -Klasse erstellt den Kernel und bezieht sich auf den 'Bootstrapper', der als Ikernel darauf.

Also habe ich der app_start/ninjectMVC3 -Klasse eine "Resolve" -Methode hinzugefügt ... funktioniert großartig.

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>();
   }
}
War es hilfreich?

Lösung

Fügen Sie Ihrem Controller den itestservice als Konstruktorparameter hinzu:

private ITestService service;

public MyController(ITestService service)
{
   this.service = service;
}

public ActionResult Index()
{
  ViewBag.Message = this.service.GetMessage();
  return View();
}

Ninject injiziert den ItestService automatisch in Ihren Controller. Verwenden Sie dann das Servicefeld in Ihrer Indexmethode.


Wenn Sie nicht möchten, dass Ninject in Ihren Controller -Konstruktor injiziert wird, können Sie sich in Ihrer Indexmethode in Ihrer Indexmethode um den Kernel befinden.u003CITestService> () um eine Instanz zu holen:

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

Sich ansehen Ninjektabhängigkeitsinjektion für Controller in MVC3.

Andere Tipps

Schritte:

  1. Erstellen Sie ein neues ASP.NET MVC 3 -Projekt
  2. Installieren Sie das Nuget -Paket aus der Paketkonsole: Install-Package Ninject.MVC3
  3. In 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. Im App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top