การเพิ่มบริการหลังจากสร้างตู้คอนเทนเนอร์แล้ว


89

เป็นไปได้หรือไม่ที่จะลงทะเบียนบริการในเวลาทำงานซึ่งหมายความว่าหลังจากContainerBuilderสร้างเสร็จแล้วและContainerได้สร้าง (และContainerBuilderกำจัดทิ้ง) แล้ว?


ปัจจุบันแนวทางปฏิบัติที่ดีที่สุดกล่าวว่าคอนเทนเนอร์ AutoFac ไม่เปลี่ยนรูป
Ady

คำตอบ:


96

ใช่คุณทำได้โดยใช้UpdateวิธีการContainerBuilder:

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

newBuilder.Update(existingContainer);

2
โปรดทราบว่าการอัปเดตคอนเทนเนอร์ที่มีอยู่ซึ่งใช้ในการแก้ไขแล้วอาจส่งผลให้เกิดพฤติกรรมที่ไม่ชัดเจน ตัวอย่างเช่นการแทนที่ส่วนประกอบที่อ้างอิงของ singletons ที่แก้ไขแล้วทำให้ส่วนประกอบดั้งเดิมยังคงถูกอ้างอิง
สตีเวน

13
การปรับปรุงจะถูกเลิกgithub.com/autofac/Autofac/issues/811
Chase Florell

20

เนื่องจาก ContainerBuilder.Update เลิกใช้แล้วคำแนะนำใหม่คือให้ใช้ขอบเขตอายุการใช้งานเด็ก

การเพิ่มการลงทะเบียนในขอบเขตอายุการใช้งาน

Autofac ช่วยให้คุณสามารถเพิ่มการลงทะเบียน "ได้ทันที" เมื่อคุณสร้างขอบเขตอายุการใช้งาน สิ่งนี้สามารถช่วยคุณได้เมื่อคุณจำเป็นต้องทำการลบล้างการลงทะเบียนแบบ จำกัด "เฉพาะจุดเชื่อม" หรือถ้าโดยทั่วไปคุณต้องการข้อมูลเพิ่มเติมบางอย่างในขอบเขตที่คุณไม่ต้องการลงทะเบียนทั่วโลก คุณทำได้โดยส่งแลมบ์ดาไปยัง BeginLifetimeScope () ที่ใช้ ContainerBuilder และเพิ่มการลงทะเบียน

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.
}

การทำงานกับขอบเขตอายุการใช้งาน


สิ่งที่ควรทราบก็คือความคิดเห็นในบล็อกการใช้งาน "การลงทะเบียนเพิ่มเติมจะใช้ได้เฉพาะในช่วงอายุการใช้งานนี้เท่านั้น"
Ady
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.