Menambahkan layanan setelah kontainer dibuat

89

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

Paul Knopf
sumber
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);
Peter Lillevold
sumber
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

wezzix
sumber
Hal yang perlu diperhatikan adalah komentar tersebut di blok using. "Pendaftaran tambahan hanya akan tersedia dalam lingkup seumur hidup ini."
Ady