Domanda

Voglio installare Ninject per fare un semplice test, nonché dimostrare la facilità d'installazione utilizzando Nuget. Voglio risolvere un servizio campione.

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

corro il NuGet Install-pacchetto NinjectMVC3 .... piacevolmente cade NinjectMVC3.cs nella mia cartella App_Start, decorato con qualche WebActivator attributi per avere tutto caricato.

Avanti aggiungo la mia vincolante nel metodo NinjectMVC3.RegisterServices:

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

Ora voglio 'uso' Ninjet per risolvere il mio ITestService.

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

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

C'è un'altra parte alla creazione di Ninject? Ho bisogno di fornire un sistema di risoluzione?

Qual è il codice che ho bisogno di risolvere il mio ITestService.

aiuto thanksasking »

** * * * * * * * * * * * Aggiornamento: * * * * * * * * * * * * * * * * **

Grazie per le grandi risposte per quanto riguarda l'iniezione 'di controllo del costruttore'. La semplice aggiunta di un costruttore con l'ITestServcice come param .... BAMM !!!

private ITestService _service;

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

Ora, qual è la soluzione ideale per quando ho bisogno di ottenere direttamente il kernel.

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

Posso vedere la classe NinjectMVC3 crea il kernel, ma non detiene o esporre un riferimento ad esso, né posso trovare una classe / metodo ovvio per 'ottenere il kernel'.

Presumo te è un modo Ninject per farlo, ma non è sicuro.

** * * * * * * * * * * * (finale) Aggiornamento: * * * * * * * * * * * * * * * * **

Grazie ancora per le risposte e commenti ....

Correzione: La classe NinjectMVC3 crea il kernel, e fa riferimento attesa al 'avvio automatico', che, come un Ikernel su di esso

.

Così ho aggiunto un metodo di 'volontà' alla classe App_Start / NinjectMVC3 ... funziona alla grande.

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>();
   }
}
È stato utile?

Soluzione

Aggiungi l'ITestService come parametro costruttore per il controller:

private ITestService service;

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

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

Ninject inietterà automaticamente l'ITestService nel controller. Quindi utilizzare il campo di servizio all'interno del vostro metodo di indice.


In alternativa, se non si vuole Ninject di iniettare nel vostro costruttore del controller, è possibile mantenere in tutto il kernel si crea, poi dentro il metodo Index, si chiama kernel.Get () per afferrare un caso:

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

Date un'occhiata al Ninject dipendenza iniettare per i controllori a MVC3 .

Altri suggerimenti

Passi:

  1. Creare un nuovo progetto ASP.NET MVC 3
  2. Installare il pacchetto NuGet dalla Console Pacchetto: 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. In App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITestService>().To<TestService>();
    }       
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top