Apakah mungkin untuk menyelesaikan sebuah contoh dari IOptions<AppSettings>
dari ConfigureServices
metode dalam Startup? Biasanya Anda dapat menggunakan IServiceProvider
untuk menginisialisasi instance, tetapi Anda tidak memilikinya pada tahap ini saat Anda mendaftarkan layanan.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
c#
asp.net-core
inversion-of-control
asp.net-core-mvc
Muhammad Rehan Saeed
sumber
sumber
ConfigureServices
metode.BuildServiceProvider
menyebabkan peringatan jika digunakan dalam kode aplikasi sepertiConfigureServices
itu menghasilkan salinan tambahan layanan tunggal yang dibuat. Jawaban Ehsan Mirsaeedi di sini adalah solusi paling ideal untuk kasus seperti ini.Cara terbaik untuk membuat instance kelas yang bergantung pada layanan lain adalah dengan menggunakan kelebihan Add XXX yang memberi Anda IServiceProvider . Dengan cara ini Anda tidak perlu membuat contoh penyedia layanan perantara.
Contoh berikut menunjukkan bagaimana Anda dapat menggunakan kelebihan ini dalam metode AddSingleton / AddTransient .
sumber
Cara termudah dan paling benar untuk mencapai ini, di semua versi ASP.NET Core , adalah dengan mengimplementasikan
IConfigureOptions<TOptions>
antarmuka. Meskipun ini telah ada sejak .NET Core 1.0, tampaknya hanya sedikit orang yang tahu tentang cara membuat Just Work ™ .Misalnya, Anda ingin menambahkan validator model kustom yang memiliki ketergantungan pada salah satu layanan aplikasi Anda yang lain. Awalnya tampaknya tidak mungkin - tidak ada cara untuk menyelesaikannya
IMyServiceDependency
karena Anda tidak memiliki akses keIServiceProvider
:Tapi "keajaiban"
IConfigureOptions<TOptions>
membuatnya begitu mudah:Pada dasarnya, penyiapan apa pun yang seharusnya Anda lakukan di dalam
Add***(***Options)
delegasiConfigureServices
sekarang dipindahkan ke metodeIConfigureOptions<TOptions>
kelas AndaConfigure
. Kemudian Anda mendaftarkan opsi dengan cara yang sama seperti Anda mendaftarkan layanan lain, dan Anda pergi!Untuk detail lebih lanjut, serta informasi tentang cara kerjanya di balik layar, saya merujuk Anda ke Andrew Lock yang selalu luar biasa .
sumber
Apakah Anda mencari sesuatu seperti berikut? Anda dapat melihat komentar saya di kode:
sumber
Ingin membantu orang lain yang berpenampilan sama tetapi saat menggunakan Autofac juga.
Jika Anda ingin mendapatkan ILifetimeScope (yaitu kontainer dengan cakupan saat ini) Anda perlu memanggil
app.ApplicationServices.GetAutofacRoot()
metodeConfigure(IApplicationBuilder app)
ini akan mengembalikan contoh ILifetimeScope yang dapat Anda gunakan untuk menyelesaikan layanansumber