Avhengighetsinjeksjon er et programvaremønster som hjelper deg med å bygge pluggbare implementeringer i applikasjonen din ved hjelp av løst koblede, testbare komponenter. Det eliminerer de hardkodede avhengighetene mellom typene og gjør typene dine lettere å bygge, teste og vedlikeholde over tid. IOC (Inversion of Control) designmønster sier at objekter ikke skal lage objekter som de er avhengige av for å utføre noe aktivitet.
Du har mange IOC-containere som hjelper deg med automatisk instantiering og livssyklusadministrasjon av objektene. Merk at avhengighetsinjeksjon er en delmengde av IOC-prinsippet. IOC-containere utnytter avhengighetsinjeksjon for å invertere strømmen av kontroll.
Starter
For å komme i gang med denne implementeringen, opprett et nytt WebAPI-prosjekt i Visual Studio. Deretter installerer du de nødvendige pakkene fra NuGet for å jobbe med NInject. Du kan installere Ninject.Web.WebApi.WebHost-pakken via NuGet Package Manager. Dette vil igjen installere følgende to pakker for deg.
Ninject.Web.WebApi
Ninject.Web.WebApi.WebHost
Avhengighetsinjeksjon ved hjelp av NInject
Når Ninject.Web.WebApi.WebHost-pakken er installert, opprettes filen NInject.WebCommon.cs automatisk i App_Start-mappen i prosjektet. Det ville bli generert mye kokeplatekode - bare ignorere den og se metoden RegisterServices (). Ved første øyekast, her er hvordan denne metoden vil se ut.
private static void RegisterServices (IKernel kernel)
{
}
Du må skrive koden din i RegisterServices-metoden for å registrere tjenestene eller injisere avhengighetene. Vi kommer tilbake til dette senere i denne artikkelen.
I dette eksemplet vil vi bruke konstruktørinjeksjon - en type avhengighetsinjeksjon der en eller flere avhengigheter injiseres gjennom konstruktører. De to andre typene avhengighetsinjeksjon inkluderer: setterinjeksjon og grensesnittinjeksjon. Jeg dekket dette i detalj i et av mine tidligere innlegg.
Som et neste trinn, opprett en ny kontroller med navnet AuthorsController til WebAPI-prosjektet du har opprettet. Bytt ut standardkoden til AuthorsController med den som er oppgitt nedenfor.
offentlig klasse AuthorsController: ApiController
{
privat readonly IAuthorRepository repository;
public AuthorsController (IAuthorRepository repository)
{
this.repository = repository;
}
offentlig liste Get ()
{
return repository.GetAllAuthors ();
}
}
AuthorsController inneholder en readonly referanse til IAuthorRepository-grensesnittet, en argumentkonstruktør og en Get-handlingsmetode. Merk at AuthorsController bruker en konstruktør til å injisere avhengigheten, dvs. det er en argumentkonstruktør som godtar en referanse til IAuthorRepository-grensesnittet som en parameter. IAuthorRepository-grensesnittet er implementert av klassen AuthorRepository. Slik ser IAuthorRepository-grensesnittet ut.
offentlig grensesnitt IAuthorRepository
{
Liste GetAllAuthors ();
}
Metoden GetAllAuthors () brukes til å returnere en liste over forfattere. Forfatternavnene er hardkodede. Klassen AuthorRepository implementerer GetAllAuthors-metoden som vist nedenfor.
public class AuthorRepository: IAuthorRepository
{
offentlig liste GetAllAuthors ()
{
Listeforfattere = ny liste ();
author.Add ("Joydip");
author.Add ("Pete");
forfattere. Legg til ("Steve");
returnere forfattere;
}
}
Registrering av tjenestene våre hos Ninject
Dette trinnet er ganske enkelt. Husker vi at vi diskuterte RegisterServices-metoden tidligere? Dette tilhører den statiske klassen NinjectWebCommon i NinjectWebCommon.cs-filen. Slik kan du bruke RegisterServices-metoden til å løse avhengighetene.
private static void RegisterServices (IKernel kernel)
{
kernel.Bind (). To ();
}
Og det er alt du trenger å gjøre. Hvis du ser noen kjøretidsfeil som er relatert til NInject, kan det skyldes ActivationException. For å fikse det, bør du installere den nyeste versjonen av Ninject.Web.WebApi-pakken. Bare oppgrader Ninject.Web.WebApi igjen, kompiler på nytt og kjør deretter søknaden din på nytt.
Du kan se på dette innlegget for å få mer informasjon om hvordan vi kan bruke NInject med WebAPI.