Cara menggunakan injeksi ketergantungan di ASP.Net Core

Dukungan untuk injeksi ketergantungan dibangun ke dalam ASP.Net Core, framework sumber terbuka, lintas platform, lean, dan modular Microsoft untuk membangun aplikasi web berkinerja tinggi dan skalabel. Di ASP.Net Core, layanan kerangka kerja dan layanan aplikasi dapat dimasukkan ke dalam kelas Anda, daripada digabungkan secara erat. Pada artikel ini kita akan melihat bagaimana kita dapat bekerja dengan injeksi ketergantungan di ASP.Net Core.

Injeksi ketergantungan (juga dikenal sebagai DI) adalah pola desain di mana kelas atau objek memiliki kelas dependennya yang diinjeksi (diteruskan oleh kelas atau objek lain) daripada membuatnya secara langsung. Injeksi ketergantungan memfasilitasi kopling yang longgar dan meningkatkan kemampuan pengujian dan perawatan. Selain itu, injeksi dependensi memungkinkan Anda mengubah implementasi tanpa harus mengubah class atau antarmuka yang memanfaatkan implementasi tersebut.

Membuat layanan tersedia melalui injeksi ketergantungan di ASP.Net

Kami sekarang akan membangun layanan sederhana di Visual Studio menggunakan ASP.Net Core dan mengilustrasikan bagaimana kami dapat menambahkannya ke wadah injeksi ketergantungan, mendaftarkannya dengan pipeline, dan kemudian mengkonsumsinya dalam aplikasi kami. Ikuti langkah-langkah berikut untuk membuat proyek ASP.Net Core baru di Visual Studio 2017 atau Visual Studio 2015. Jika Anda menggunakan Visual Studio 2015, pastikan Anda telah menginstal .Net Core.

  1. Buka Visual Studio
  2. Klik File -> New -> Project
  3. Di Jendela Dialog Proyek Baru, pilih template proyek "ASP.NET Core Web Application"
  4. Tentukan nama dan lokasi untuk proyek Anda dan klik OK untuk menyimpan

Sekarang, buat kelas POCO (objek CLI biasa tua) berikut. Kelas ini hanya berisi satu properti - ini mewakili semua area topik yang dicakup oleh penulis dari perusahaan penerbitan tertentu.

kelas publik TopicArea

    {

        Nama string publik {get; set; }

    }

Pertimbangkan antarmuka berikut ini bernama ITopicAreaServiceyang mewakili kontrak untuk TopicAreaService.

antarmuka publik ITopicAreaService

    {

        IEnumerable GetAllTopicAreas ();

    }

The ITopicAreaServiceantarmuka berisi deklarasi salah satu metode yang disebut GetAllTopicAreas(). The TopicAreaServicemengimplementasikan kelas ITopicAreaServiceseperti yang ditunjukkan di bawah ini.

kelas publik TopicAreaService: ITopicAreaService

    {

        publik IEnumerable GetAllTopicAreas ()

        {

            kembalikan Daftar baru

        {

            TopicArea {Name} baru,

            TopicArea {Name} baru,

            TopicArea baru {Name}

        };

        }

    }

Mendaftarkan layanan untuk injeksi ketergantungan di ASP.Net

Langkah selanjutnya adalah mendaftarkan TopicAreaServicewadah injeksi ketergantungan yang tersedia sebagai bagian dari ASP.Net Code. Untuk melakukannya, tulis kode berikut dalam ConfigureServicesmetode di file Startup.cs. The ConfigureServicesMetode menambahkan layanan untuk wadah layanan, yang membuat mereka tersedia di aplikasi Anda melalui injeksi ketergantungan. Ini dipanggil oleh runtime secara otomatis.

public void ConfigureServices (layanan IServiceCollection)

        {

            services.AddTransient ();

            // Tambahkan layanan kerangka kerja.

            services.AddMvc ();

        }

Jika Anda memiliki beberapa layanan yang perlu didaftarkan, Anda dapat menggunakan metode ekstensi seperti yang ditunjukkan di bawah ini.

ServiceExtensions kelas publik statis

    {

        public static IServiceCollection RegisterServices (

            Layanan IServiceCollection ini)

        {

            services.AddTransient ();

            // Tambahkan semua layanan lain di sini.

            layanan pengembalian;

        }

    }

Menggunakan RegisterServicesmetode memungkinkan Anda untuk menjaga ConfigureServicesmetode Anda tetap ramping dan mudah dipelihara. Alih-alih menentukan setiap layanan dalam ConfigureServices, yang perlu Anda lakukan hanyalah memanggil RegisterServicesmetode ekstensi satu kali dalam ConfigureServicesmetode Anda seperti yang ditunjukkan pada cuplikan kode di bawah.

public void ConfigureServices (layanan IServiceCollection)

        {

            services.RegisterServices ();

            // Tambahkan layanan kerangka kerja.

            services.AddMvc ();

        }

Masa pakai injeksi ketergantungan di ASP.Net

Umur injeksi ketergantungan digunakan untuk menentukan kapan objek dependen dibuat dan dibuat ulang. Sejauh umur untuk instans injeksi ketergantungan dalam aplikasi ASP.Net Core, ada tiga kemungkinan:

  1. Singleton: Ini menyiratkan hanya satu contoh yang akan dibuat dan dibagikan oleh semua konsumen.
  2. Cakupan: Ini menyiratkan bahwa satu instance per cakupan (yaitu, satu instance per permintaan ke aplikasi) akan dibuat.
  3. Transient: Ini menyiratkan bahwa komponen tidak akan dibagikan tetapi akan dibuat setiap kali diminta.

Perhatikan bahwa dalam contoh ini kami telah menggunakan Transienttipe. Cuplikan kode berikut menggambarkan bagaimana Anda dapat menggunakan jenis masa pakai lainnya saat mendaftarkan layanan Anda.

services.AddScoped ();

services.AddSingleton ();

Menggunakan layanan melalui injeksi ketergantungan di ASP.Net

Sekarang layanan yang kami terapkan telah ditambahkan ke pipeline, Anda dapat menggunakannya di salah satu pengontrol dalam proyek ASP.Net Core Anda. Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat meminta sebuah instance dari TopicAreaServicepengontrol Anda.

pribadi hanya baca ITopicAreaService _topicAreaService;

    public DefaultController (ITopicAreaService topicAreaService)

    {

        _topicAreaService = topicAreaService;

    }

Berikut ini bagaimana GetAllTopicAreasmetode TopicAreaServicedipanggil dari metode aksi pengontrol Anda.

[HttpGet]

        publik IEnumerable GetAllTopicAreas ()

        {

            kembali _topicAreaService.GetAllTopicAreas ();

        }

Diberikan di bawah ini adalah daftar kode lengkap dari kelas controller untuk referensi Anda.
menggunakan Microsoft.AspNetCore.Mvc;

menggunakan System.Collections.Generic;

namespace ASPNETCoreDI.Controllers

{

    [Menghasilkan (“application / json”)]

    [Rute (“api / Default”)]

    kelas publik DefaultController: Controller

    {

        pribadi hanya baca ITopicAreaService _topicAreaService;

        public DefaultController (ITopicAreaService topicAreaService)

        {

            _topicAreaService = topicAreaService;

        }

        [HttpGet]

        publik IEnumerable GetAllTopicAreas ()

        {

            kembali _topicAreaService.GetAllTopicAreas ();

        }

    }

}

Anda dapat memanfaatkan dukungan bawaan untuk injeksi ketergantungan di ASP.Net Core untuk membangun aplikasi yang modular, ramping, dan bersih, mudah dirawat dan diuji. Penyedia injeksi ketergantungan bawaan di ASP.Net Core tidak sekaya fitur seperti container seperti StructureMap dan Ninject, tetapi cukup cepat dan, seperti yang telah kita lihat, mudah dikonfigurasi dan digunakan.