ฉันได้ใช้การพึ่งพาการฉีดในฤดูใบไม้ผลิมาระยะหนึ่งแล้วและฉันเข้าใจว่ามันทำงานอย่างไรและข้อดีและข้อเสียของการใช้มันคืออะไร อย่างไรก็ตามเมื่อฉันสร้างคลาสใหม่ฉันมักจะสงสัย - คลาสนี้ควรจัดการโดย Spring IOC Container หรือไม่
และฉันไม่ต้องการพูดถึงความแตกต่างระหว่างคำอธิบายประกอบ @Autowired, การกำหนดค่า XML, การฉีด setter, การฉีดคอนสตรัคเตอร์ ฯลฯ คำถามของฉันคือคำถามทั่วไป
สมมติว่าเรามีบริการที่มีตัวแปลง:
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private Converter converter;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
return converter.mapToDto(cars);
}
}
@Component
public class Converter {
public CarDto mapToDto(List<Car> cars) {
return new ArrayList<CarDto>(); // do the mapping here
}
}
เห็นได้ชัดว่าตัวแปลงไม่มีการอ้างอิงใด ๆ ดังนั้นจึงไม่จำเป็นที่จะต้องทำการยืนยันอัตโนมัติ แต่สำหรับฉันมันดูเหมือนว่าจะดีกว่าที่เป็น autowired รหัสสะอาดและง่ายต่อการทดสอบ ถ้าฉันเขียนรหัสนี้โดยไม่ DI บริการจะมีลักษณะดังนี้:
@Service
public class Service {
@Autowired
private Repository repository;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
Converter converter = new Converter();
return converter.mapToDto(cars);
}
}
ตอนนี้มันยากมากที่จะทดสอบ นอกจากนี้ตัวแปลงใหม่จะถูกสร้างขึ้นสำหรับการดำเนินการแปลงทุกครั้งแม้ว่าจะอยู่ในสถานะเดิมเสมอซึ่งดูเหมือนว่าจะอยู่เหนือหัว
Spring MVC มีรูปแบบที่รู้จักกันดีบางประการ: ตัวควบคุมที่ใช้บริการและบริการโดยใช้ที่เก็บ จากนั้นหาก Repository เป็น autowired (ซึ่งโดยปกติจะเป็น) ก็จะต้องมีการ autowired ด้วย และนี่ค่อนข้างชัดเจน แต่เราจะใช้คำอธิบายประกอบ @Component เมื่อใด หากคุณมีคลาส util static (เช่นตัวแปลง, ตัวแม็พ) - คุณ autowire พวกเขาหรือไม่?
คุณพยายามที่จะทำให้ทุกชั้น autowired? จากนั้นการอ้างอิงระดับทั้งหมดนั้นง่ายต่อการฉีด (อีกครั้งง่ายต่อการเข้าใจและทดสอบได้ง่าย) หรือคุณลอง autowire เฉพาะเมื่อจำเป็นจริงๆเท่านั้น?
ฉันใช้เวลาค้นหากฎทั่วไปบางอย่างเกี่ยวกับเวลาที่จะใช้การลงทะเบียนอัตโนมัติ แต่ฉันไม่พบเคล็ดลับเฉพาะใด ๆ โดยปกติแล้วผู้คนพูดถึง "คุณใช้ DI หรือไม่ (ใช่ / ไม่ใช่)" หรือ "คุณชอบการฉีดประเภทใดที่คุณชอบ" ซึ่งไม่ตอบคำถามของฉัน
ฉันจะขอบคุณสำหรับคำแนะนำเกี่ยวกับหัวข้อนี้!