Dependency Injection adalah nama yang mengerikan (IMO) 1 untuk konsep yang agak langsung. Ini sebuah contoh:
- Anda memiliki metode (atau kelas dengan metode) yang melakukan X (mis. Mengambil data dari basis data)
- Sebagai bagian dari melakukan X, metode tersebut menciptakan dan mengelola sumber daya internal (misalnya a
DbContext
). Sumber daya internal inilah yang disebut dependensi
- Anda menghapus pembuatan dan pengelolaan sumber daya (yaitu
DbContext
) dari metode dan menjadikannya penelepon tanggung jawab untuk menyediakan sumber daya ini (sebagai parameter metode atau berdasarkan instantiasi kelas)
- Anda sekarang melakukan injeksi ketergantungan.
[1] : Saya berasal dari latar belakang tingkat bawah dan butuh waktu berbulan-bulan untuk duduk dan belajar injeksi ketergantungan karena namanya menyiratkan itu akan menjadi sesuatu yang jauh lebih rumit, seperti DLL Injection . Fakta bahwa Visual Studio (dan kami pengembang pada umumnya) merujuk ke .NET libraries (DLLs, atau assemblies ) yang bergantung pada proyek karena dependensi tidak membantu sama sekali. Bahkan ada yang namanya Dependency Walker (depend.exe) .
[Sunting] Saya pikir beberapa kode demo akan berguna untuk beberapa, jadi inilah satu (dalam C #).
Tanpa injeksi ketergantungan:
public class Repository : IDisposable
{
protected DbContext Context { get; }
public Repository()
{
Context = new DbContext("name=MyEntities");
}
public void Dispose()
{
Context.Dispose();
}
}
Konsumen Anda kemudian akan melakukan sesuatu seperti:
using ( var repository = new Repository() )
{
// work
}
Kelas yang sama diimplementasikan dengan pola injeksi ketergantungan akan seperti ini:
public class RepositoryWithDI
{
protected DbContext Context { get; }
public RepositoryWithDI(DbContext context)
{
Context = context;
}
}
Sekarang responsabilitas penelepon untuk membuat instance DbContext
dan meneruskan (errm, menyuntikkan ) ke kelas Anda:
using ( var context = new DbContext("name=MyEntities") )
{
var repository = new RepositoryWithDI(context);
// work
}