Verwendung der Abhängigkeitsinjektion in ASP.Net Core

Die Unterstützung für die Abhängigkeitsinjektion ist in ASP.Net Core integriert, dem Open Source-, plattformübergreifenden, schlanken und modularen Framework von Microsoft zum Erstellen leistungsstarker, skalierbarer Webanwendungen. In ASP.Net Core können sowohl Framework-Services als auch Anwendungsdienste in Ihre Klassen eingefügt werden, anstatt eng miteinander verbunden zu sein. In diesem Artikel werden wir uns ansehen, wie wir mit der Abhängigkeitsinjektion in ASP.Net Core arbeiten können.

Die Abhängigkeitsinjektion (auch als DI bezeichnet) ist ein Entwurfsmuster, bei dem einer Klasse oder einem Objekt abhängige Klassen injiziert (von einer anderen Klasse oder einem anderen Objekt übergeben) werden, anstatt sie direkt zu erstellen. Die Abhängigkeitsinjektion erleichtert die lose Kopplung und fördert die Testbarkeit und Wartung. Darüber hinaus können Sie mit der Abhängigkeitsinjektion Ihre Implementierungen ändern, ohne die Klassen oder Schnittstellen ändern zu müssen, die diese Implementierungen nutzen.

Bereitstellung eines Dienstes über die Abhängigkeitsinjektion in ASP.Net

Wir werden nun einen einfachen Dienst in Visual Studio mit ASP.Net Core erstellen und veranschaulichen, wie wir ihn dem Abhängigkeitsinjektionscontainer hinzufügen, in der Pipeline registrieren und dann in unserer Anwendung verwenden können. Führen Sie die folgenden Schritte aus, um ein neues ASP.Net Core-Projekt in Visual Studio 2017 oder Visual Studio 2015 zu erstellen. Wenn Sie Visual Studio 2015 verwenden, stellen Sie sicher, dass .Net Core installiert ist.

  1. Öffnen Sie Visual Studio
  2. Klicken Sie auf Datei -> Neu -> Projekt
  3. Wählen Sie im Dialogfeld "Neues Projekt" die Projektvorlage "ASP.NET Core-Webanwendung" aus
  4. Geben Sie den Namen und den Speicherort für Ihr Projekt an und klicken Sie zum Speichern auf OK

Erstellen Sie nun die folgende POCO-Klasse (einfaches altes CLI-Objekt). Diese Klasse enthält nur eine Eigenschaft - sie repräsentiert alle Themenbereiche, die von den Autoren eines bestimmten Verlags abgedeckt werden.

öffentliche Klasse TopicArea

    {

        öffentlicher String Name {get; einstellen; }}

    }}

Betrachten Sie die folgende benannte Schnittstelle ITopicAreaService, die den Vertrag für die darstellt TopicAreaService.

öffentliche Schnittstelle ITopicAreaService

    {

        IEnumerable GetAllTopicAreas ();

    }}

Die ITopicAreaServiceSchnittstelle enthält die Deklaration einer aufgerufenen Methode GetAllTopicAreas(). Die TopicAreaServiceKlasse implementiert das ITopicAreaServicewie unten gezeigt.

öffentliche Klasse TopicAreaService: ITopicAreaService

    {

        public IEnumerable GetAllTopicAreas ()

        {

            Neue Liste zurückgeben

        {

            neuer TopicArea {Name},

            neuer TopicArea {Name},

            neuer TopicArea {Name}

        };

        }}

    }}

Registrieren von Diensten für die Abhängigkeitsinjektion in ASP.Net

Der nächste Schritt besteht darin, den TopicAreaServiceContainer mit dem Abhängigkeitsinjektionsregister zu registrieren, der als Teil des ASP.Net-Codes verfügbar ist. Schreiben Sie dazu den folgenden Code in die ConfigureServicesMethode in der Datei Startup.cs. Die ConfigureServicesMethode fügt dem Dienstcontainer Dienste hinzu, die sie über die Abhängigkeitsinjektion in Ihrer App verfügbar machen. Es wird von der Laufzeit automatisch aufgerufen.

public void ConfigureServices (IServiceCollection-Dienste)

        {

            services.AddTransient ();

            // Framework Services hinzufügen.

            services.AddMvc ();

        }}

Wenn Sie mehrere Dienste haben, die registriert werden müssen, können Sie eine Erweiterungsmethode wie unten gezeigt verwenden.

öffentliche statische Klasse ServiceExtensions

    {

        öffentliche statische IServiceCollection RegisterServices (

            diese IServiceCollection-Dienste)

        {

            services.AddTransient ();

            // Alle anderen Dienste hier hinzufügen.

            Rückholservice;

        }}

    }}

Mit der RegisterServicesMethode können Sie Ihre ConfigureServicesMethode schlank und wartbar halten. Anstatt jeden Dienst in anzugeben ConfigureServices, müssen Sie die RegisterServicesErweiterungsmethode nur einmal in Ihrer ConfigureServicesMethode aufrufen , wie im folgenden Codeausschnitt gezeigt.

public void ConfigureServices (IServiceCollection-Dienste)

        {

            services.RegisterServices ();

            // Framework Services hinzufügen.

            services.AddMvc ();

        }}

Lebensdauer der Abhängigkeitsinjektion in ASP.Net

Die Lebensdauer der Abhängigkeitsinjektion wird verwendet, um anzugeben, wann die abhängigen Objekte erstellt und neu erstellt werden. In Bezug auf die Lebensdauer von Abhängigkeitsinjektionsinstanzen in ASP.Net Core-Anwendungen gibt es drei Möglichkeiten:

  1. Singleton: Dies bedeutet, dass nur eine einzige Instanz erstellt und von allen Verbrauchern gemeinsam genutzt wird.
  2. Gültigkeitsbereich: Dies bedeutet, dass eine Instanz pro Gültigkeitsbereich (dh eine Instanz pro Anforderung an die Anwendung) erstellt wird.
  3. Vorübergehend: Dies bedeutet, dass die Komponenten nicht gemeinsam genutzt werden, sondern bei jeder Anforderung erstellt werden.

Beachten Sie, dass wir in diesem Beispiel den TransientTyp verwendet haben. Das folgende Codefragment zeigt, wie Sie die anderen Lebensdauertypen bei der Registrierung Ihres Dienstes verwenden können.

services.AddScoped ();

services.AddSingleton ();

Verwenden eines Dienstes über die Abhängigkeitsinjektion in ASP.Net

Nachdem der von uns implementierte Service zur Pipeline hinzugefügt wurde, können Sie ihn in jedem der Controller in Ihrem ASP.Net Core-Projekt verwenden. Das folgende Codefragment zeigt, wie Sie eine Instanz von TopicAreaServicein Ihrem Controller anfordern können .

privat schreibgeschützt ITopicAreaService _topicAreaService;

    öffentlicher DefaultController (ITopicAreaService topicAreaService)

    {

        _topicAreaService = topicAreaService;

    }}

So wird die GetAllTopicAreasMethode von TopicAreaServicevon der Aktionsmethode Ihres Controllers aufgerufen.

[HttpGet]

        public IEnumerable GetAllTopicAreas ()

        {

            return _topicAreaService.GetAllTopicAreas ();

        }}

Im Folgenden finden Sie die vollständige Codeliste der Controller-Klasse als Referenz.
using Microsoft.AspNetCore.Mvc;

using System.Collections.Generic;

Namespace ASPNETCoreDI.Controllers

{

    [Produziert ("application / json")]

    [Route ("API / Standard")]

    öffentliche Klasse DefaultController: Controller

    {

        privat schreibgeschützt ITopicAreaService _topicAreaService;

        öffentlicher DefaultController (ITopicAreaService topicAreaService)

        {

            _topicAreaService = topicAreaService;

        }}

        [HttpGet]

        public IEnumerable GetAllTopicAreas ()

        {

            return _topicAreaService.GetAllTopicAreas ();

        }}

    }}

}}

Sie können die integrierte Unterstützung für die Abhängigkeitsinjektion in ASP.Net Core nutzen, um Anwendungen zu erstellen, die modular, schlank und sauber, einfach zu warten und zu testen sind. Der in ASP.Net Core integrierte Anbieter für Abhängigkeitsinjektion ist nicht so funktionsreich wie Container wie StructureMap und Ninject, aber er ist recht schnell und, wie wir gesehen haben, einfach zu konfigurieren und zu verwenden.