Menambahkan layanan setelah kontainer dibuat


89

Apakah mungkin untuk mendaftarkan layanan pada saat run-time, artinya setelah ContainerBuilderdibuat dan Containertelah dibuat (dan ContainerBuilderdibuang)?


Saat ini, praktik terbaik mengatakan penampung AutoFac tidak dapat diubah
Ady

Jawaban:


96

Ya Anda bisa, menggunakan Updatemetode pada ContainerBuilder:

var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);

2
Perhatikan bahwa memperbarui penampung yang sudah ada yang telah digunakan untuk menyelesaikannya dapat mengakibatkan perilaku yang tidak pasti. Misalnya, mengganti komponen yang merupakan dependensi dari single yang sudah diselesaikan menyebabkan komponen asli tetap direferensikan.
Steven

13
Pembaruan tidak berlaku lagi github.com/autofac/Autofac/issues/811 .
Mengejar Florell

20

Karena ContainerBuilder.Update sudah tidak digunakan lagi, rekomendasi baru adalah menggunakan cakupan seumur hidup turunan.

Menambahkan Registrasi ke Lifetime Scope

Autofac memungkinkan Anda menambahkan registrasi "dengan cepat" saat Anda membuat cakupan seumur hidup. Ini dapat membantu Anda saat Anda perlu melakukan semacam penggantian pendaftaran terbatas "pengelasan titik" atau jika Anda secara umum hanya memerlukan beberapa hal tambahan dalam cakupan yang tidak ingin Anda daftarkan secara global. Anda melakukan ini dengan meneruskan lambda ke BeginLifetimeScope () yang mengambil ContainerBuilder dan menambahkan registrasi.

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}

Bekerja dengan Lingkup Seumur Hidup


Hal yang perlu diperhatikan adalah komentar tersebut di blok using. "Pendaftaran tambahan hanya akan tersedia dalam lingkup seumur hidup ini."
Ady
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.