Saya memiliki layanan yang berasal dari antarmuka yang sama.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Biasanya, wadah IOC lainnya seperti Unity
memungkinkan Anda untuk mendaftar implementasi konkret oleh beberapa Key
yang membedakannya.
Di ASP.NET Core, bagaimana cara mendaftarkan layanan ini dan menyelesaikannya saat runtime berdasarkan beberapa kunci?
Saya tidak melihat Add
metode Layanan yang mengambil key
atau name
parameter, yang biasanya akan digunakan untuk membedakan implementasi konkret.
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
Apakah pola Pabrik satu-satunya pilihan di sini?
Update1
Saya telah membaca artikel di sini yang menunjukkan bagaimana menggunakan pola pabrik untuk mendapatkan contoh layanan ketika kita memiliki beberapa implementasi konkret. Namun, itu masih bukan solusi lengkap. Ketika saya memanggil _serviceProvider.GetService()
metode, saya tidak bisa menyuntikkan data ke konstruktor.
Sebagai contoh pertimbangkan ini:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
Bagaimana cara _serviceProvider.GetService()
menyuntikkan string koneksi yang sesuai? Di Unity, atau pustaka IoC lainnya, kita bisa melakukannya di tipe registrasi. Saya dapat menggunakan IOpsi , yang mengharuskan saya menyuntikkan semua pengaturan. Saya tidak dapat menyuntikkan string koneksi tertentu ke dalam layanan.
Perhatikan juga bahwa saya mencoba untuk menghindari menggunakan wadah lain (termasuk Unity) karena saya harus mendaftarkan yang lain (misalnya, Pengendali) dengan wadah baru juga.
Juga, menggunakan pola pabrik untuk membuat mesin virtual layanan bertentangan dengan DIP, karena meningkatkan jumlah dependensi klien memiliki rincian di sini .
Jadi, saya pikir DI default di ASP.NET Core hilang dua hal:
- Kemampuan untuk mendaftarkan instance menggunakan kunci
- Kemampuan untuk menyuntikkan data statis ke konstruktor selama pendaftaran
Update1
dipindahkan ke pertanyaan yang berbeda karena menyuntikkan sesuatu dalam konstruktor sangat berbeda dari mengerjakan objek mana yang akan dibangun