ฉันรู้ว่าคำถามนี้เก่า แต่ฉันต้องการเพิ่มห้าเซ็นต์ของฉัน
ฉันคิดว่าการฉีดพึ่งพา (DI) นั้นมีหลายวิธีเช่น Factory Pattern (FP) ที่กำหนดค่าได้และในแง่นี้สิ่งใดก็ตามที่คุณสามารถทำกับ DI ได้คุณจะสามารถทำกับโรงงานดังกล่าวได้
ที่จริงแล้วถ้าคุณใช้สปริงตัวอย่างเช่นคุณมีตัวเลือกของการเก็บข้อมูลอัตโนมัติ (DI) หรือทำสิ่งนี้:
MyBean mb = ctx.getBean("myBean");
จากนั้นใช้อินสแตนซ์ 'mb' เพื่อทำอะไรก็ได้ นั่นเป็นการโทรไปยังโรงงานที่จะส่งคืนอินสแตนซ์ของคุณหรือไม่?
ความแตกต่างที่แท้จริงเพียงอย่างเดียวที่ฉันสังเกตเห็นระหว่างตัวอย่าง FP ส่วนใหญ่คือคุณสามารถกำหนดค่าสิ่งที่ "myBean" อยู่ใน xml หรือในคลาสอื่นและเฟรมเวิร์กจะทำงานเป็นโรงงาน แต่นอกเหนือจากนั้นคือสิ่งเดียวกันและคุณ สามารถมีโรงงานที่อ่านไฟล์กำหนดค่าหรือรับการนำไปใช้ตามที่ต้องการ
และถ้าคุณถามความเห็นของฉัน (และฉันรู้ว่าคุณไม่ได้) ฉันเชื่อว่า DI ทำสิ่งเดียวกัน แต่เพิ่มความซับซ้อนให้กับการพัฒนาทำไม?
ทีนี้, สำหรับสิ่งหนึ่ง, เพื่อให้คุณรู้ว่าอะไรคือการนำไปใช้งานสำหรับ bean ใด ๆ ที่คุณ autowire ด้วย DI, คุณต้องไปที่การกำหนดค่าเอง
แต่ ... สัญญาเกี่ยวกับสิ่งนั้นที่คุณจะไม่ต้องรู้ในการใช้งานวัตถุที่คุณกำลังใช้อยู่? pfft! อย่างจริงจัง? เมื่อคุณใช้วิธีการเช่นนี้ ... คุณไม่เหมือนกันที่เขียนการใช้งานหรือไม่? และแม้ว่าคุณจะไม่ทำคุณแทบจะตลอดเวลาดูว่าการใช้งานทำในสิ่งที่ควรทำอย่างไร ??
และสำหรับสิ่งสุดท้ายสิ่งหนึ่งมันไม่สำคัญว่า DI Framework จะสัญญากับคุณว่าคุณจะสร้างสิ่งต่าง ๆแยกจากมันโดยไม่มีการพึ่งพาชั้นเรียนของพวกเขาหากคุณใช้เฟรมเวิร์กที่คุณสร้างทุกสิ่งขึ้นมาถ้าคุณต้อง เปลี่ยนวิธีการหรือกรอบมันจะไม่เป็นเรื่องง่าย ... เคย! ... แต่เนื่องจากคุณซื้อทุกสิ่งรอบ ๆ กรอบนั้นแทนที่จะกังวลว่าอะไรคือทางออกที่ดีที่สุดสำหรับธุรกิจของคุณคุณจะต้องเผชิญกับปัญหาที่เกิดขึ้นเมื่อคุณทำเช่นนั้น
อันที่จริงแล้วแอปพลิเคชันทางธุรกิจที่แท้จริงเพียงวิธีเดียวสำหรับ FP หรือ DI ที่ฉันเห็นคือถ้าคุณต้องการเปลี่ยนการใช้งานที่รันไทม์แต่อย่างน้อยเฟรมเวิร์กที่ฉันรู้ไม่อนุญาตให้คุณทำเช่นนั้นคุณต้องออกไป ทุกอย่างสมบูรณ์แบบในการกำหนดค่าในขณะพัฒนาหากคุณต้องการใช้วิธีการอื่น
ดังนั้นถ้าฉันมีคลาสที่ทำงานแตกต่างกันในสองขอบเขตในแอปพลิเคชันเดียวกัน (สมมติว่า บริษัท สองแห่งของโฮลดิ้ง) ฉันต้องกำหนดกรอบการทำงานเพื่อสร้างสองถั่วที่แตกต่างกันและปรับรหัสของฉันเพื่อใช้งาน ไม่เหมือนกับฉันจะเขียนแบบนี้:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
เช่นเดียวกับนี้:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
และนี่:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
ไม่ว่าในกรณีใดคุณจะต้องเปลี่ยนบางสิ่งบางอย่างในแอปพลิเคชันของคุณไม่ว่าจะเป็นคลาสหรือไฟล์การกำหนดค่า แต่คุณจะต้องทำการปรับใช้ใหม่
มันคงจะดีถ้าทำอะไรแบบนี้:
MyBean mb = (MyBean)MyFactory.get("mb");
และด้วยวิธีนี้คุณกำหนดรหัสของโรงงานเพื่อให้เกิดการใช้งานอย่างถูกต้องในขณะใช้งานโดยขึ้นอยู่กับองค์กรผู้ใช้ที่เข้าสู่ระบบ ?? ตอนนี้จะเป็นประโยชน์ คุณสามารถเพิ่ม jar ใหม่พร้อมคลาสใหม่และตั้งกฎได้แม้ในขณะรันไทม์ (หรือเพิ่มไฟล์ config ใหม่หากคุณเปิดตัวเลือกนี้ไว้) ไม่มีการเปลี่ยนแปลงในคลาสที่มีอยู่ นี่จะเป็นโรงงานไดนามิก!
จะไม่เป็นประโยชน์มากกว่าการเขียนสองการกำหนดค่าสำหรับแต่ละองค์กรและอาจมีสองแอปพลิเคชันที่แตกต่างกันสำหรับแต่ละ
คุณสามารถบอกฉันว่าฉันไม่จำเป็นต้องทำสวิตช์ที่รันไทม์ดังนั้นฉันจึงกำหนดค่าแอพและถ้าฉันสืบทอดคลาสหรือใช้การใช้งานอื่นฉันแค่เปลี่ยนการตั้งค่าและการปรับใช้ใหม่ ตกลงที่สามารถทำได้กับโรงงาน และซื่อสัตย์คุณทำเช่นนี้กี่ครั้ง อาจจะเฉพาะเมื่อคุณมีแอพที่จะใช้ในที่อื่นใน บริษัท ของคุณและคุณจะส่งรหัสไปยังทีมอื่นและพวกเขาจะทำสิ่งนี้ แต่เดี๋ยวก่อนที่สามารถทำได้กับโรงงานและจะดียิ่งขึ้นด้วยโรงงานแบบไดนามิก !!
อย่างไรก็ตามส่วนความคิดเห็นหากเปิดให้คุณฆ่าฉัน