Score:1

แทรกอินสแตนซ์ใหม่ของบริการลงในคลาสบริการอื่น

ธง de

ฉันมีบริการ (สำหรับการส่งการแจ้งเตือนข้อผิดพลาด) ซึ่งใช้โดยบริการอื่น ๆ

บริการแจ้งเตือนถูกแทรกเข้าไปในคลาสเหล่านั้นผ่านไฟล์ services.yml ที่เกี่ยวข้องและผ่านตัวสร้าง

อย่างไรก็ตาม ทั้งสองคลาสใช้อินสแตนซ์เดียวกันของบริการ (บางสิ่งที่ฉันไม่เคยรู้มาก่อนจนถึงตอนนี้) ถ้าฉันตั้งค่าคุณสมบัติจากคลาสหนึ่ง คลาสอื่นก็พร้อมใช้ในภายหลัง

ในบางกรณีสิ่งนี้จะดีมาก แต่ในกรณีการใช้งานของฉัน ฉันต้องการให้แต่ละคลาสเริ่มต้นด้วยการแสดงใหม่ของคลาสบริการแจ้งเตือน

มีวิธีผ่าน services.yml ตัวสร้างหรือวิธีอื่นใดเพื่อให้บรรลุเป้าหมายนี้หรือไม่

Jaypan avatar
de flag
บริการเป็นแบบ singletons - มีไว้เพื่อสร้างอินสแตนซ์เพียงครั้งเดียวเท่านั้น บริการมีฟังก์ชันการทำงาน ซึ่งไม่จำเป็นต้องมีไว้สำหรับการจัดเก็บข้อมูล ดังนั้นคุณอาจต้องคิดใหม่เกี่ยวกับสถาปัตยกรรมที่อยู่เบื้องหลังวิธีที่คุณจัดเก็บข้อมูล และจัดเก็บโดยสัมพันธ์กับวัตถุหรือในคลาสที่เรียกใช้บริการ
Geat avatar
de flag
นั่นสมเหตุสมผลแล้ว มีบริการเทียบเท่าแบบ non-singleton ที่สามารถฉีดเข้าไปในคลาสได้หรือไม่?
Jaypan avatar
de flag
ไม่ แต่ถ้าไม่ใช่ซิงเกิลตัน ก็ไม่จำเป็นต้องใส่ คุณสามารถสร้างอินสแตนซ์ใหม่ของคลาสได้ตามต้องการ
Geat avatar
de flag
ฉันชอบแนวคิดในการใช้บริการโรงงาน โดยเฉพาะอย่างยิ่งสำหรับคลาสที่มีโฮสต์ของคอนสตรัคเตอร์อาร์กิวเมนต์
4uk4 avatar
cn flag
ในบริการ Drupal เป็นซิงเกิลตันเริ่มต้น (ใช้ร่วมกัน) แต่คุณสามารถกำหนดบริการที่ไม่ใช้ร่วมกันได้ ดู https://symfony.com/doc/current/service_container/shared.html
Geat avatar
de flag
@ 4k4 ฉันรู้สึกว่านี่ไม่ใช่วิธีที่ Drupal ตั้งใจจะใช้บริการ แต่เป็นสิ่งที่ฉันกำลังมองหา
Score:3
ธง cn

คำตอบโดยตรงคือการอ้างถึงเอกสารประกอบของ Symfony:

ในคอนเทนเนอร์บริการ บริการทั้งหมดจะถูกแชร์โดยค่าเริ่มต้น นี้ หมายความว่าทุกครั้งที่คุณเรียกใช้บริการ คุณจะได้รับบริการเหมือนเดิม ตัวอย่าง. โดยปกติจะเป็นพฤติกรรมที่คุณต้องการ แต่ในบางกรณี คุณอาจต้องการรับอินสแตนซ์ใหม่เสมอ

หากต้องการรับอินสแตนซ์ใหม่เสมอ ให้ตั้งค่าที่ใช้ร่วมกันเป็นเท็จ ในคำจำกัดความบริการของคุณ:

# config/services.yaml
บริการ:
    App\SomeNonSharedService:
        ใช้ร่วมกัน: เท็จ
        # ...

https://symfony.com/doc/current/service_container/shared.html

การสนทนาเกี่ยวกับความตั้งใจของ Drupal ยากเพราะไม่ค่อยมีแหล่งอ้างอิง เมื่อ Drupal 8 ได้รับการออกแบบ การตั้งค่าบริการนี้ไม่มีอยู่จริง และรุ่นก่อนหน้าก็กลับมามีข้อพิพาทแล้ว เนื่องจากขอบเขตคำขอถูกลบออกไปแล้ว ฉันไม่พบข้อมูลอ้างอิงใด ๆ ที่ Drupal มีอคติต่อการใช้บริการที่ไม่ได้ใช้งานร่วมกัน ในทางตรงกันข้าม นี่คือการอภิปรายที่ในที่สุดแกนหลักก็เปลี่ยนจากโรงงานเป็นบริการที่ไม่ได้ใช้งานร่วมกัน ซึ่งอันที่จริงแล้วเป็นโซลูชันที่ใช้โรงงานเช่นกัน เพียงแต่ว่านี่เป็นโรงงานที่ดำเนินการใน Symfony แล้ว:

https://www.drupal.org/project/drupal/issues/2660124#comment-12318542

Score:2
ธง ph

มีตัวเลือกสองสามอย่างที่อยู่ในใจ:

  1. สร้างบริการจากโรงงานที่จัดเตรียมอินสแตนซ์ของคลาสการแจ้งเตือนที่ไม่ใช่บริการของคุณ
  2. ใช้คลาสการแจ้งเตือนของคุณเป็นปลั๊กอิน

สิ่งที่คุณเลือกขึ้นอยู่กับสถาปัตยกรรมของคุณจริงๆ

Geat avatar
de flag
ฉันปรับโครงสร้างโค้ดใหม่ และบริการโรงงานก็ทำงานได้อย่างสวยงาม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา