โรงงาน DI / IoC คอนเทนเนอร์ vs โรงงาน: ฉันจะกำหนดค่าแอปพลิเคชันของฉันได้ที่ไหนและเพราะเหตุใด


9

ฉันกำลังพยายามคิดออกว่าจะใช้รีจิสตรี DIC / IoC ในการกำหนดค่าซอฟต์แวร์ของฉันและเมื่อใดที่จะใช้โรงงานพร้อมกับเหตุผลที่อยู่เบื้องหลังทั้งสองวิธี


ฉันใช้ StructureMap เป็น DI container ของฉัน (DIC) ซึ่งง่ายต่อการกำหนดค่าโดยใช้การลงทะเบียน ใน DIC จริงวัตถุที่ลงทะเบียนทั้งหมดเป็นแบบคงที่ในความรู้สึกที่ฉันไม่จำเป็นต้องเปลี่ยน / แลกเปลี่ยนการใช้งาน / อินสแตนซ์ที่รันไทม์เมื่อ DIC มีการกำหนดค่าและพวกเขาจะถูกกำหนดค่าใน DIC เป็น singletons อย่างไรก็ตามเนื่องจากซอฟต์แวร์ (SW) ของฉันจะทำงานในอุปกรณ์ต่าง ๆ ฉันจึงต้องเลือกรีจิสตรีเฉพาะอุปกรณ์ขึ้นอยู่กับอุปกรณ์ที่ SW ของฉันทำงานเพื่อกำหนดค่าฮาร์ดแวร์ให้เหมาะสม

เนื่องจากการสร้างวัตถุบางอย่างของฉันต้องอ่านในไฟล์กำหนดค่าฉันจึงใช้โรงงานเพื่อส่งคืนอินสแตนซ์เหล่านี้ไปยัง DIC เพื่อแยกการอ่านการกำหนดค่าออกจากการสร้างวัตถุ ฉันลงทะเบียนตัวรับสัญญาณจากโรงงานใน DIC สำหรับประเภทปลั๊กอินที่เกี่ยวข้อง

ตอนนี้บอกว่าฉันมีประเภทปลั๊กอินที่IMotorมีรูปแบบที่เป็นรูปธรรมMotor1และMotor2ซึ่งควรได้รับการจัดการโดยโรงงาน ขณะนี้มีสองวิธีที่ฉันสามารถตัดสินใจได้ว่าจะกำหนดค่าอุปกรณ์ของฉันอย่างไร:

  1. ฉันผ่านข้อมูลเกี่ยวกับอุปกรณ์ที่ว่า SW กำลังทำงานอยู่บนไปMotorFactoryและจะส่งกลับมอเตอร์ที่ถูกต้องอย่างใดอย่างหนึ่งหรือMotor1 Motor2ในกรณีนี้ตรรกะในการตัดสินใจอยู่ภายในโรงงาน
  2. ผมกำหนดค่าไอซีตามไปยังอุปกรณ์ที่ทำงานอยู่ในและสร้างโรงงานที่สองMotor1FactoryและMotor2Factoryที่หนึ่งสร้างและอื่น ๆMotor1 Motor2ในกรณีนี้ผมจะมีที่แตกต่างกันสำหรับรายการรีจิสทรีIMotorในการลงทะเบียนเฉพาะอุปกรณ์ที่ใช้อย่างใดอย่างหนึ่งหรือMotor1FactoryMotor2Factory

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

ดังนั้นอีกครั้ง: เมื่อใดฉันจึงควรใช้วิธีหนึ่งหรือวิธีอื่น และที่สำคัญยิ่งกว่า: อะไรคือตัวบ่งชี้ที่ดีสำหรับการตัดสินใจว่าจะไปทางไหน?


2
วิธีไหนง่ายกว่ากัน? ประโยชน์ของวิธีการที่ซับซ้อนกว่ามีค่ามากกว่าความซับซ้อนเพิ่มเติมหรือไม่
Robert Harvey

คำตอบ:


2

ถ้าคุณใช้ทั้งฉันจะไปหาอะไรง่าย ๆ :

  • DI / IoC: สำหรับการกำหนดค่าทุกอย่างที่จะไม่เปลี่ยนแปลงในขณะใช้งานจริง
  • Factory: สำหรับการสร้างอินสแตนซ์ของวัตถุที่ runtime ซึ่งขึ้นอยู่กับพารามิเตอร์อินพุตของ runtime อินสแตนซ์ของโรงงานถูกฉีดโดยคอนเทนเนอร์ DI

1

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

สิ่งที่ฉันเห็นคือคุณสงสัยว่าโรงงานควรเลือกมอเตอร์หรือถ้า DIC ควรเลือกโรงงานที่ผลิตมอเตอร์เฉพาะ

เป็นการยากที่จะเลือกอย่างแม่นยำเนื่องจากโรงงานและ DIC ทำสิ่งที่คล้ายกันมาก ความแตกต่างคือโรงงานมุ่งเน้นไปที่ปัญหาเฉพาะและ DIC นั้นกว้างกว่า

มันมาถึงคำถามนี้: คุณต้องการรหัสที่เฉพาะเจาะจงสำหรับปัญหานี้ที่จะอยู่ในโรงงานหรือไม่? หรือเป็นเรื่องทั่วไปมากกว่าเช่นการอ่านรายละเอียดการกำหนดค่าจากไฟล์?

เก็บไว้ในใจว่าในขณะที่คุณอาจได้รับการเลือกระหว่างMotor1และวันนี้พรุ่งนี้อาจจะมีMotor2 Motor3ชอบการออกแบบที่จะทำให้Motor3ง่ายต่อการเพิ่ม


0

ฉันจะแยกตรรกะ "มอเตอร์ที่จะใช้" ลงในโรงงานพิเศษที่เรียกว่าบิลเดอร์ (รูปแบบ) และใช้ IOC-Container สำหรับมอเตอร์ทั้งสองเป็นรายละเอียดการใช้งานของผู้สร้าง

ตามกฎทั่วไป:

  • คุณต้องมีโรงงาน (หรือผู้สร้าง) หากคุณต้องสร้างวัตถุแบบไดนามิกจำนวนมากของคลาส / อินเทอร์เฟซ (เช่นสำหรับรถยนต์ทุกคันที่คุณผลิตคุณต้องสร้างมอเตอร์ใหม่หนึ่งตัว)
  • ถ้าคุณต้องการเพียงหนึ่งอินสแตนซ์คงที่ของคลาส ioc / di สามารถทำงานให้คุณได้ (เช่นคุณต้องการอินสแตนซ์แบบคงที่เพียงหนึ่งเดียวของบริการการชำระเงินและหนึ่งอินสแตนซ์คงที่ของ MotorBuilderService)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.