Ninject.MVC3, Nuget, WebActivator oh mein
Will ich setup Ninject, um einen einfachen test, sowie demonstrieren ease-of-setup unter Verwendung von Nuget. Ich möchte lösen, ein Probe-service.
public interface ITestService
{
string GetMessage();
}
public class TestService : ITestService
{
public string GetMessage() { return "hello world"; }
}
Ich das NuGet " Install-Package NinjectMVC3 .... es schön fällt NinjectMVC3.cs in mein App_Start-Ordner, dekoriert mit einigen WebActivator Attribute, bis alles geladen ist.
Nächstes füge ich meine Bindung in der NinjectMVC3.RegisterServices Methode:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ITestService>().To<TestServiceOne>();
}
Jetzt will ich zu 'verwenden' Ninjet zu beheben meine ITestService.
public ActionResult Index()
{
//[Ninject, give me the service I need]
ITestService service = ???
ViewBag.Message = service.GetMessage();
return View();
}
Gibt es einen anderen Teil der Einrichtung Ninject?
Brauche ich, um eine resolver?
Was ist der code, den ich lösen muss meine ITestService.
thanksasking Hilfe »
** * * * * * * * * * * * Update: * * * * * * * * * * * * * * * * **
Danke für die tollen Antworten, die bezüglich des controller-Konstruktor' Injektion.
Einfaches hinzufügen einen Konstruktor mit der ITestServcice als param .... HOPPLA !!!
private ITestService _service;
public HomeController(ITestService service)
{
_service = service
}
public ActionResult Index()
{
ViewBag.Message = _service.GetMessage();
return View();
}
Was ist nun die ideale Lösung für Sie, wenn ich brauche, um die der Kernel direkt.
var kernel = ... //Go grab the kernel from ????? (thanks Judah).
ITestService service = kernel.Get<ITestService>();
Sehe ich die NinjectMVC3 Klasse erstellt den Kernel, aber nicht halten Sie oder setzen Sie ein Verweis darauf, noch finde ich ein offensichtlich Klasse/Methode, um die 'kernel'.
Ich nehme an, dir ist ein Ninject-Weg, es zu bekommen, aber nicht sicher.
** * * * * * * * * * * * (Final Update) : * * * * * * * * * * * * * * * * **
Nochmals vielen Dank für die Antworten und Kommentare ....
Korrektur: Die NinjectMVC3 Klasse erstellt den Kernel, und hält Verweis auf die "Bootstrapper", die als IKernel drauf.
Also habe ich ein 'lösen' Methode der App_Start/NinjectMVC3 Klasse ... funktioniert Super.
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>();
}
}
- Dies ist sicherlich eine Frage der Meinung, sondern die Ihrer NinjectMVC3.Beheben<T> statische Methode ist ein Beispiel für den service locator anti-pattern. Generell, dependency injection sollte sein, "zu sagen, Fragen Sie nicht," Art der Sache. Mark Seemann beschreibt dies in seinem blog, die möglicherweise helfen, zu klären, die Dinge ein wenig. blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie die ITestService als Konstruktor-parameter auf dem controller:
Ninject wird automatisch injizieren die ITestService in den controller. Dann nutzen Sie den service Bereich in Ihrem Index-Methode.
Alternativ, wenn Sie nicht wollen, Ninject, um zu injizieren, in dem controller-Konstruktor können Sie halten, um den kernel, den Sie erstellen, dann in Ihrem Index-Methode, die Sie aufrufen kernel.Get<ITestService>() zu packen, ein Beispiel:
Haben Sie einen Blick auf Ninject dependency inject für Controller in MVC3.
Schritte:
Install-Package Ninject.MVC3
Im HomeController:
In
App_Start/NinjectMVC3.cs
: