Programmering

Sådan bruges afhængighedsinjektion i ASP.Net Core

Support til afhængighedsinjektion er indbygget i ASP.Net Core, Microsofts open source, cross platform, lean og modulær ramme til opbygning af skalerbare webapplikationer med høj ydeevne. I ASP.Net Core kan både framework-tjenester og applikationstjenester injiceres i dine klasser snarere end at være tæt koblet. I denne artikel ser vi på, hvordan vi kan arbejde med afhængighedsinjektion i ASP.Net Core.

Afhængighedsinjektion (også kendt som DI) er et designmønster, hvor en klasse eller et objekt får sine afhængige klasser injiceret (videregivet til det af en anden klasse eller et objekt) snarere end at oprette dem direkte. Afhængighedsindsprøjtning letter løs kobling og fremmer testbarhed og vedligeholdelse. Desuden giver afhængighedsinjektion dig mulighed for at ændre dine implementeringer uden at skulle ændre de klasser eller grænseflader, der udnytter disse implementeringer.

Gør en tjeneste tilgængelig via afhængighedsinjektion i ASP.Net

Vi bygger nu en simpel tjeneste i Visual Studio ved hjælp af ASP.Net Core og illustrerer, hvordan vi kan føje den til afhængighedsinjektionsbeholderen, registrere den med pipelinen og derefter forbruge den i vores applikation. Følg disse trin for at oprette et nyt ASP.Net Core-projekt i Visual Studio 2017 eller Visual Studio 2015. Hvis du bruger Visual Studio 2015, skal du sørge for, at .Net Core er installeret.

  1. Åbn Visual Studio
  2. Klik på File -> New -> Project
  3. I dialogvinduet Nyt projekt skal du vælge projektskabelonen “ASP.NET Core Web Application”
  4. Angiv navn og placering til dit projekt, og klik på OK for at gemme

Opret nu følgende POCO-klasse (almindeligt gammelt CLI-objekt). Denne klasse indeholder kun en egenskab - den repræsenterer alle emneområderne, der er dækket af forfatterne til et bestemt forlag.

offentlig klasse TopicArea

    {

public string Name {get; sæt; }

    }

Overvej følgende interface navngivet ITopicAreaService der repræsenterer kontrakten for TopicAreaService.

offentlig grænseflade ITopicAreaService

    {

IEnumerable GetAllTopicAreas ();

    }

Det ITopicAreaService interface indeholder erklæringen om en kaldet metode GetAllTopicAreas (). Det TopicAreaService klasse implementerer ITopicAreaService som vist nedenfor.

offentlig klasse TopicAreaService: ITopicAreaService

    {

offentlig IEnumerable GetAllTopicAreas ()

        {

returner ny liste

        {

nyt TopicArea {Name},

nyt TopicArea {Name},

nyt TopicArea {Name}

        };

        }

    }

Registrering af tjenester til afhængighedsinjektion i ASP.Net

Det næste trin er at registrere TopicAreaService med den afhængighedsindsprøjtningsbeholder, der er tilgængelig som en del af ASP.Net-koden. For at gøre dette skal du skrive følgende stykke kode i ConfigureServices metode i filen Startup.cs. Det ConfigureServices metoden tilføjer tjenester til servicebeholderen, hvilket gør dem tilgængelige i din app via afhængighedsinjektion. Det kaldes automatisk af runtime.

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

        {

services.AddTransient ();

// Tilføj rammetjenester.

services.AddMvc ();

        }

Hvis du har flere tjenester, der skal registreres, kan du bruge en udvidelsesmetode som vist nedenfor.

offentlig statisk klasse ServiceExtensions

    {

offentlig statisk IServiceCollection RegisterServices (

denne IServiceCollection-tjenester)

        {

services.AddTransient ();

// Tilføj alle andre tjenester her.

returneringstjenester;

        }

    }

Bruger RegisterServices metode giver dig mulighed for at beholde din ConfigureServices metode slank og vedligeholdelig. I stedet for at specificere hver tjeneste i ConfigureServices, alt hvad du skal gøre er at ringe til RegisterServices udvidelsesmetode en gang i din ConfigureServices metode som vist i kodestykket nedenfor.

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

        {

services.RegisterServices ();

// Tilføj rammetjenester.

services.AddMvc ();

        }

Levetid for afhængighedsinjektion i ASP.Net

Afhængighedsindsprøjtningens levetid bruges til at angive, hvornår de afhængige objekter oprettes og genoprettes. Hvad angår levetider for tilfælde af afhængighedsinjektion i ASP.Net Core-applikationer, er der tre muligheder:

  1. Singleton: Dette indebærer, at kun en enkelt forekomst oprettes og deles af alle forbrugere.
  2. Scoped: Dette indebærer, at der oprettes en forekomst pr. Omfang (dvs. en forekomst pr. Anmodning til applikationen).
  3. Transient: Dette betyder, at komponenterne ikke deles, men oprettes hver gang de bliver anmodet om.

Bemærk, at vi i dette eksempel har brugt Forbigående type. Følgende kodestykke illustrerer, hvordan du kan bruge de andre typer levetid, når du registrerer din tjeneste.

services.AddScoped ();

services.AddSingleton ();

Brug af en tjeneste via afhængighedsinjektion i ASP.Net

Nu hvor den service, vi implementerede, er blevet føjet til rørledningen, kan du bruge den i en hvilken som helst af controllerne i dit ASP.Net Core-projekt. Følgende kodestykke illustrerer, hvordan du kan anmode om en forekomst af TopicAreaService i din controller.

privat readonly ITopicAreaService _topicAreaService;

offentlig DefaultController (ITopicAreaService topicAreaService)

    {

_topicAreaService = topicAreaService;

    }

Sådan gør du GetAllTopicAreas metode til TopicAreaService kaldes fra din controllers handlingsmetode.

[HttpGet]

offentlig IEnumerable GetAllTopicAreas ()

        {

returnere _topicAreaService.GetAllTopicAreas ();

        }

Nedenfor er den komplette kodeliste over controller-klassen til din reference.
ved hjælp af Microsoft.AspNetCore.Mvc;

ved hjælp af System.Collections.Generic;

navneområde ASPNETCoreDI.Controllers

{

[Producerer (“ansøgning / json”)]

[Rute (“api / standard”)]

offentlig klasse DefaultController: Controller

    {

privat readonly ITopicAreaService _topicAreaService;

offentlig DefaultController (ITopicAreaService topicAreaService)

        {

_topicAreaService = topicAreaService;

        }

[HttpGet]

offentlig IEnumerable GetAllTopicAreas ()

        {

returnere _topicAreaService.GetAllTopicAreas ();

        }

    }

}

Du kan udnytte den indbyggede understøttelse af afhængighedsinjektion i ASP.Net Core til at opbygge applikationer, der er modulære, magre og rene, nemme at vedligeholde og teste. Den indbyggede afhængighedsinjiceringsudbyder i ASP.Net Core er ikke så funktionsrig som containere som StructureMap og Ninject, men det er ret hurtigt og som vi har set let at konfigurere og bruge.

$config[zx-auto] not found$config[zx-overlay] not found