Berbagi teknologi

Wadah C# IOC, injeksi ketergantungan dan inversi kontrol

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pembalikan Kontrol (IoC)

definisi : Pembalikan kontrol adalah prinsip desain yang membalik aliran kontrol dalam pemrograman tradisional. Dalam model pemrograman tradisional, ketergantungan antar komponen dibuat dan dipelihara secara internal oleh komponen itu sendiri. Dalam mode kontrol inversi, ketergantungan ini dikelola oleh wadah eksternal (seperti kerangka Spring, Microsoft.Extensions.DependencyInjection di .NET, dll.). Komponen tidak lagi bertanggung jawab atas dependensinya sendiri, tetapi menyuntikkan semua dependensi melalui wadah eksternal.

ide utama: Memindahkan pembuatan objek dan pengelolaan ketergantungan di antara objek tersebut dari objek itu sendiri ke wadah eksternal.

keuntungan

  • Kurangi kopling: Ketergantungan antar komponen tidak lagi bersifat hard-code, sehingga implementasi komponen dapat diganti dengan lebih mudah, sehingga meningkatkan fleksibilitas dan pemeliharaan sistem.
  • Tingkatkan modularitas: Komponen individual dapat dikembangkan dan diuji secara independen karena komponen tersebut tidak bergantung pada implementasi spesifik, tetapi pada antarmuka abstrak atau kelas abstrak.
  • Mudah untuk diuji: Karena ketergantungan antar komponen dieksternalisasi, lebih mudah menggunakan objek tiruan atau stub pengujian untuk mensimulasikan ketergantungan pada pengujian unit.

Injeksi Ketergantungan (DI)

definisi : Injeksi ketergantungan adalah cara khusus untuk mencapai inversi kontrol. Ini melibatkan meneruskan dependensi (layanan atau objek) ke dalam kelas alih-alih membiarkan kelas membuatnya sendiri.

Metode untuk mewujudkan

  • injeksi konstruktor : Dependensi disediakan melalui konstruktor kelas. Ini adalah bentuk DI yang paling umum dan direkomendasikan di C#.
  • Injeksi properti : Tetapkan dependensi melalui properti publik kelas. Pendekatan ini memberikan fleksibilitas tetapi dapat mengekspos keadaan internal dan mengurangi enkapsulasi.
  • metode injeksi : Meneruskan dependensi melalui parameter metode. Cocok untuk memasukkan hanya dependensi yang diperlukan oleh metode tertentu.

wadah IOC

definisi :Kontainer IOC adalah kerangka kerja untuk mengelola siklus hidup dan ketergantungan objek. Secara otomatis membuat objek berdasarkan konfigurasi (seperti file XML, anotasi, atau konfigurasi kode) dan memasukkan dependensi ke objek tersebut.

memengaruhi

  • Pembuatan objek: Secara otomatis membuat instance objek berdasarkan konfigurasi.
  • injeksi ketergantungan: Menyuntikkan dependensi ke objek untuk mencapai inversi kontrol.
  • manajemen siklus hidup: Mengelola siklus hidup objek, termasuk penciptaan, penghancuran, dan daur ulang sumber daya.

Gunakan kontainer IOC untuk mengelola dependensi

Di C#, Anda dapat menggunakan berbagai kontainer IOC untuk mengelola dependensi, seperti Microsoft.Extensions.DependencyInjection (kontainer DI bawaan .NET Core dan versi yang lebih baru), Autofac, dll. Berikut ini contoh Microsoft.Extensions.DependencyInjection untuk memperkenalkan cara menggunakan kontainer IOC untuk mengelola dependensi dalam proyek C#.

Langkah 1: Daftar untuk layanan

Layanan biasanya digunakan dalam aplikasi .NETProgram.csatauStartup.cs(untuk proyek ASP.NET Core) digunakan diIServiceCollectionantarmuka untuk mendaftar.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Langkah 2: Suntikkan dependensi

Menyuntikkan dependensi pada pengontrol, layanan, atau kelas lainnya melalui konstruktor.

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Dalam contoh di atas,MyControllerKelas disuntikkan melalui konstruktorIMyServiceImplementasi antarmuka (mis.MyService baik).Dengan cara ini, kapanMyControllerSaat dibuat, wadah IOC akan secara otomatisIMyServiceImplementasinya disuntikkan ke konstruktor.

Tindakan pencegahan
  • Gunakan abstraksi berbasis antarmuka: Lebih memilih antarmuka atau kelas abstrak untuk tipe dependen guna meningkatkan fleksibilitas dan kemampuan pengujian.
  • Hindari penggunaan lajang secara berlebihan: Layanan Singleton harus digunakan dengan hati-hati untuk menghindari masalah terkait negara.
  • Pantau siklus hidup objek: Memahami siklus hidup dependensi (tunggal, cakupan, sementara) untuk mengelola penggunaan sumber daya secara efektif.