पर विचार करते समय डोमेन इकाइयों को डीटीओ में सही ढंग से कैसे परिवर्तित करें, मैंने डोमेन ऑब्जेक्ट्स को डीटीओ में परिवर्तित करने के लिए कई लेख और स्टैक ओवरफ्लो पोस्ट पढ़े हैं और उन्हें मेरे कोड में बाहर करने की कोशिश की है। जब परीक्षण और मापनीयता की बात आती है तो मुझे हमेशा कुछ मुद्दों का सामना करना पड़ रहा है। मैं डोमेन ऑब्जेक्ट्स को डीटीओ में परिवर्तित करने के लिए निम्नलिखित तीन संभावित समाधानों को जानता हूं। ज्यादातर समय मैं वसंत का उपयोग कर रहा हूँ।स्केलेबिलिटी और टेस्टेबिलिटी
समाधान 1:
पहले संभव समाधान परिवर्तित करने के लिए सेवा परत में निजी विधि सेवा परत कोड में एक छोटी सी "सहायक" विधि है जो मेरी डीटीओ वस्तु को पुनः प्राप्त डेटाबेस वस्तु convertig है बनाने के लिए है ।
@Service
public MyEntityService {
public SomeDto getEntityById(Long id){
SomeEntity dbResult = someDao.findById(id);
SomeDto dtoResult = convert(dbResult);
// ... more logic happens
return dtoResult;
}
public SomeDto convert(SomeEntity entity){
//... Object creation and using getter/setter for converting
}
}
पेशेवरों: -:
-
- आसान लागू करने के लिए रूपांतरण की जरूरत के लिए कोई अतिरिक्त वर्ग> परियोजना संस्थाओं
विपक्ष के साथ उड़ा नहीं है
- परीक्षण करते समय समस्याएं,के रूप मेंमेरी
when(someDao.findById(id)).thenReturn(alsoDeeplyNestedObject)
की एक पर्याप्त परिणाम प्रदान करने के लिए privated विधि में प्रयोग किया जाता है और अगर वस्तु गहरा नीडिंत है मेरे पास है NullPointers से बचने के लिए यदि रूपांतरण भी आंतरिक संरचना
समाधान 2 भंग किया जाता है: डीटीओ में अतिरिक्त निर्माता डोमेन इकाई को डीटीओ
मेरा दूसरा समाधान कन्स्ट्रक्टर में ऑब्जेक्ट को कन्वर्ट करने के लिए मेरे डीटीओ इकाई में एक अतिरिक्त कन्स्ट्रक्टर जोड़ना होगा।
public class SomeDto {
// ... some attributes
public SomeDto(SomeEntity entity) {
this.attribute = entity.getAttribute();
// ... nesting convertion & convertion of lists and arrays
}
}
पेशेवरों: -:
-
- जरूरत परिवर्तित
- रूपांतरण डीटीओ इकाई में hided के लिए कोई अतिरिक्त वर्ग> सेवा कोड छोटे
विपक्ष हैका उपयोग 10 सेवा कोड में और इसके लिए मुझे अपने
someDao
मॉकिंग के परिणामस्वरूप सही नेस्टेड ऑब्जेक्ट स्ट्रक्चर प्रदान करना होगा।
समाधान 3: Converter<S, T>
लेकिन इस समाधान हर externalized वर्ग है जो के लिए खड़ा है: स्प्रिंग के कनवर्टर या किसी अन्य इस परिवर्तित
हाल ही में देखा है कि वसंत परिवर्तित कारणों के लिए एक वर्ग पेशकश कर रहा है, तो के लिए बीन externalized का उपयोग करना कनवर्ट करना इस समाधान के साथ मैं कनवर्टर को अपने सेवा कोड में इंजेक्शन दे रहा हूं और जब मैं डोमेन इकाई को अपने डीटीओ में परिवर्तित करना चाहता हूं तो मैं इसे कॉल करता हूं।
सकारात्मक:
- के रूप में मैं अपने परीक्षण मामले के दौरान परिणाम नकली कर सकते हैं कार्यों की
- जुदाई का परीक्षण करने के लिए आसान -> एक समर्पित वर्ग काम
विपक्ष कर रहा है:
- मेरा डोमेन मॉडल बढ़ने के जितना "स्केल" नहीं करता है। (-> डीटीओ को डीटीओ entitiy और entitiy परिवर्तित)
आप मेरी समस्या के लिए और अधिक समाधान है और आप इसे कैसे संभाल करते हो संस्थाओं मैं हर नई इकाई के लिए दो कन्वर्टर्स बनाने के लिए की एक बहुत कुछ के साथ? क्या आप हर नए डोमेन ऑब्जेक्ट के लिए एक नया कनवर्टर बनाते हैं और परियोजना में कक्षाओं की मात्रा के साथ "लाइव" कर सकते हैं?
अग्रिम धन्यवाद!
विकल्प 4 [MapStruct] (http://mapstruct.org) जैसे कुछ का उपयोग कर विकल्प 4। –