Contoh Contoh menggunakan inti Asp.net
Tautan Video yang Direkam: https://www.youtube.com/watch?v=oVj1IHw8GLU
IkhtisarDI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core mendukung pola desain perangkat lunak dependency injection (DI), yang merupakan teknik untuk mencapai Inversion of Control (IoC) antara kelas dan dependensinya.
Melalui wadah IoC, kita bisa mencapainya
Di inti Asp.net, IoC Container memiliki antarmuka bawaan.
Siklus Hidup DI berikut ini adalah
Pada dasarnya ada dua jenis layanan di ASP.NET Core:
Layanan Kerangka: Layanan yang merupakan bagian dari kerangka Inti ASP.NET seperti IApplicationBuilder, IHostingEnvironment, ILoggerFactory dll.
Layanan Aplikasi: Layanan (tipe atau kelas khusus) yang Anda sebagai pemrogram buat untuk aplikasi Anda.
Pengontrol Asp.Net Core MVC meminta dependensi secara eksplisit melalui konstruktor 1. Injeksi Konstruktor 2. Injeksi Metode (Tingkat tindakan) 3. Injeksi Propery (tidak didukung) 4. Lihat Injeksi
Injeksi Konstruktor: - Layanan ditambahkan sebagai parameter konstruktor dan runtime menyelesaikan layanan dari wadah layanan (IServiceCollection-- DiContainer). Layanana biasanya didefinisikan menggunakan kelas non-konkret (antarmuka)
Metode Injeksi : - Menggunakan atribut [FromService] memungkinkan menyuntikkan layanan langsung ke metode tindakan tanpa menggunakan injeksi pengontrol
Injeksi Properti Saat ini (inti Asp.net) wadah IOC bawaan tidak mendukung injeksi properti. Untuk ini, Anda dapat menggunakan wadah layanan bawaan (IOC) pihak ketiga.
Lihat Injeksi Menggunakan direktif [Inject] memungkinkan layanan injeksi langsung ke halaman tampilan tanpa menggunakan pengontrol atau injeksi metode
Kontainer IoC bawaan mendukung tiga jenis masa pakai:
Dalam contoh contoh, antarmuka layanan "IMyDependency" mendefinisikan metode "WriteMessage".
public interface IMyDependency
{
void WriteMessage(string message);
}
Antarmuka ini diimplementasikan dengan tipe konkret, MyDependency:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
Sekarang, Daftarkan layanan "IMyDependency" dengan tipe konkret "MyDependency" (di startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
Di sini metode Add() dari instance "IServiceCollection" digunakan untuk mendaftarkan layanan dengan container IoC. "ServiceDescriptor" digunakan untuk menentukan jenis layanan dan implementasi konkrit. Ini akan mendaftarkan layanan kami dalam wadah dengan default sebagai "Singleton"
Sekarang, mari kita masukkan layanan dengan masa hidup yang berbeda
Singleton (Kasus penggunaan : ketika kita perlu membuat layanan negara):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
Sementara (Kasus penggunaan: ketika kita perlu membuat layanan tanpa kewarganegaraan):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
Cakupan (Kasus penggunaan: Layanan basis data):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
Kami juga dapat memasukkan layanan menggunakan metode ekstensi bawaan
Lajang
layanan.AddSingleton
Sementara
layanan.AddTransisent
Cakupan
layanan.AddScoped
kelas publik HomeController : Pengontrol { private readonly IMyDependency _service;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
kelas publik HomeController : Pengendali {
public IActionResult Index()
{
return View();
}
}
Di Index.cshtml
@{ ViewData["Judul"] = "Halaman Beranda"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
kelas publik HomeController : Pengendali {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}