เล่นการฉีดการพึ่งพาจาวาของเฟรมเวิร์ก - เมื่อใดจึงควรใช้ซิงเกิลตัน

ฉันกำลังพยายามหาวิธีใช้การพึ่งพาการฉีดใน Play Framework 2.4 ฉันคุ้นเคยกับหลักการทั่วไป แต่ไม่เข้าใจความหมายของการออกแบบจริงๆ เหตุผลทั่วไปของฉันคือวิธีการแบบคงที่ในคลาสคอนโทรลเลอร์นั้นเหมือนกับการใช้ตัวแปรส่วนกลางมากเกินไป และนั่นอาจทำให้เกิดปัญหากับความปลอดภัยของเธรดได้ง่าย ฯลฯ รวมถึงโดยทั่วไปแล้วยังสนับสนุนการออกแบบที่ไม่ดีอีกด้วย ดังนั้นเนื่องจากตอนนี้ Play สนับสนุนให้เปลี่ยนไปใช้การแทรกการพึ่งพา ฉันจึงควรเปลี่ยนเช่นกัน

สิ่งที่ฉันสับสนคือแนวปฏิบัติที่ดีในบริบทนี้คืออะไร เมื่อฉันอ่านเอกสารอย่างเป็นทางการของ Play จะพูดถึงสั้นๆ เกี่ยวกับการแทรกการพึ่งพา จากนั้นจึงกล่าวถึงคำอธิบายประกอบ @Singleton ทันที และและตัวอย่างที่มีอยู่ (http://www.typesafe.com/activator/template/play-guice) พูดถึงคลาสเดี่ยว "WelcomeTextGenerator" เช่นกัน

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


person myrosia    schedule 21.07.2015    source แหล่งที่มา


คำตอบ (1)


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

การพึ่งพาการฉีดเป็นเทคนิคในการเชื่อมโยงแอปพลิเคชันเข้าด้วยกัน คุณเขียนส่วนประกอบที่ไม่ได้ขึ้นอยู่กับส่วนประกอบอื่นโดยตรง แต่คุณฉีดส่วนประกอบเข้าหากันแทน วิธีนี้ทำให้คุณสามารถแลกเปลี่ยนแอปพลิเคชันของคุณทั้งส่วนโดยไม่ต้องแตะโค้ดแม้แต่บรรทัดเดียว Dependency Injection มีประโยชน์อย่างยิ่งเมื่อต้องเขียนการทดสอบหน่วย

เมื่อเปรียบเทียบกับวิธีการแบบคงที่ คุณสามารถใช้สิ่ง OOP แฟนซีทั้งหมดได้ โดยพื้นฐานแล้วคำถามคือ "ข้อเสียของวิธีคงที่คืออะไร"

มีประเภทออบเจ็กต์เฉพาะ (เช่น ตัวควบคุม) ที่ควรเป็นแบบซิงเกิลตัน และมีผลกระทบต่อประสิทธิภาพหรือไม่หากไม่ทำเครื่องหมายออบเจ็กต์เป็นซิงเกิลตัน

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

หากต้องการถามคำถามของคุณเมื่อใดควรใช้ @Singleton ตามกฎทั่วไป (แหล่งที่มา):

  • ออบเจ็กต์ stateful เช่น การกำหนดค่าหรือตัวนับ
  • วัตถุที่มีราคาแพงในการสร้างหรือค้นหา
  • ออบเจ็กต์ที่เชื่อมโยงทรัพยากร เช่น พูลการเชื่อมต่อฐานข้อมูล

Guice มีเอกสารประกอบที่ครอบคลุมมาก ฉันขอแนะนำให้เรียกดูผ่านบางครั้ง

person Roman    schedule 22.07.2015
comment
ขอบคุณ นั่นคือสิ่งที่ฉันต้องการ ฉันพบว่าหน้าขอบเขตที่คุณลิงก์ไปนั้นมีประโยชน์มาก จากเอกสาร Play ไม่ชัดเจนสำหรับฉันว่าทำไมจึงเน้นซิงเกิลตันหรือมีตัวเลือกอื่น ๆ ซึ่งสมเหตุสมผลกว่ามาก - person myrosia; 22.07.2015
comment
หลังจากการค้นคว้าเพิ่มเติมอีกเล็กน้อย คำเตือนที่อาจเกิดขึ้น: หน้า Scopes Guice พูดถึงขอบเขตคำขอและขอบเขตเซสชัน แต่อย่างดีที่สุดที่ฉันสามารถบอกได้คือ Play ไม่รองรับสิ่งเหล่านั้น เนื่องจากไม่ได้ใช้การใช้งานคอนเทนเนอร์เซิร์ฟเล็ตของ Google และไม่ได้จัดเตรียมของตัวเอง ในขณะนี้ ดังนั้นในแง่นั้น หน้าเอกสารอาจทำให้เข้าใจผิดได้ เนื่องจากไม่ได้ให้ความกระจ่างถึงการพึ่งพาการใช้งาน - person myrosia; 31.07.2015