2012-12-16 16 views
5

हम प्रस्तुति परत से डेटा भेजने के लिए डीटीओ का उपयोग करना चाहते हैं। हम जैसे परतें होती हैं:डीटीओ से डीटीओ को डीटीओ

  • मुखौटा
  • appService
  • डोमेन

और हम डोजर का उपयोग हमें डीटीओ को इकाई रूपांतरित करने में सहायक है। लेकिन मैं अब 2 सवाल है:

    डीटीओ हम डोजर उपयोग कर सकते हैं करने के लिए संस्था से
  1. , लेकिन संस्था के लिए डीटीओ से हम डोजर उपयोग कर सकते हैं? यदि हां, कैसे?
  2. जहां मैं इकाई बनाता हूं? मुखौटा या डीटीओएस्सेबलर में?

उदाहरण के लिए, मुझे एक पुस्तक पंजीकृत करनी है। पुस्तक इकाई देखो की तरह:

Book{ 
    public Book(BookNumber number,String name){ 
     //make sure every book has a business number, 
     //and the number can't change once the book is created. 
     this.bookNumber = number; 
     .. 
    } 
} 

और हम एक DTOAssembler हवलदार:

BookDTOAssembler{ 

    BookDTO toDAO(bookEntity){ 
    ... 
    } 
    BookEntiy fromDTO(book DTO,BookRepository bookRepository){ 
    //1.Where should i create book entity? 
    //2.Is there any effective way to convert dto to entity in java world? 
    } 
} 

विकल्प 1

the BookManagedFacade has a registerBook function: 
public registerBook(bookDTO){ 
    Book book = BookDTOAssembler.fromDTO(book DTO); 
} 

//Create book in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,BookRepository bookRepository){ 
    //book is never registered 
    if (0==bookDTO.getBookID()){ 
     Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName()); 
    }else{ 
     //book is been registed so we get it from Repository 
     book = bookRepository.findById(bookDTO.getBookID()); 
    } 
    book.setAuthor(bookDTO.getAuthor); 
    ... 
    return book; 
} 

विकल्प 2

the BookManagedFacade has a registerBook function: 
public registerBook(bookDTO){ 
    Book book = new Book(bookRepository.generateNextBookNumber(),bookDTO.getName()); 
    book = BookDTOAssembler.fromDTO(book DTO,book); 
} 

//add another function in BookDTOAssembler.fromDTO 
public static BookEntiy fromDTO(BookDTO bookDTO,Book book){ 
    book.setAuthor(bookDTO.getAuthor); 
    ... 
    return book; 
} 

एक के साथ बेहतर है? या इसे बेहतर तरीके से कार्यान्वित किया जा सकता है ..?

+1

सचमुच, मैं डोज़र से दूर रहूंगा। हम इसे अपने वर्तमान प्रोजेक्ट में उपयोग कर रहे हैं, और मुझे इससे नफरत है: यह आपको कुछ चीजों को मैन्युअल रूप से करने के लिए मजबूर करता है, या सेटर्स को जोड़कर अपनी ऑब्जेक्ट्स के encapsulation को पूरी तरह से तोड़ने के लिए मजबूर करता है जो वहां नहीं होना चाहिए। और वैसे भी कुछ संचालन इसके बिना किया जाना चाहिए। और सबसे बड़ी समस्या: यदि आप किसी संपत्ति का नाम बदलने के लिए होते हैं, तो सबकुछ ठीक से संकलित होगा, लेकिन केवल रनटाइम पर गलत परिणाम देगा। संस्थाओं में डीटीओ को बदलना और इसके विपरीत, कठिन है, बीटी यह आसान है। इसे मैन्युअल रूप से करने से यह सुनिश्चित हो जाता है कि encapsulation संरक्षित है, और refactoring की अनुमति देता है। –

+0

यह सच है! अगर कुछ भी बदल जाता है, तो यह रनटाइम पर पाया जा सकता है! मेरे प्रश्न 2 के बारे में आपकी सलाह क्या है? – tobato

+0

मुझे एक ऐसी विधि पसंद है जो सिर्फ एक बुकडीटीओ से एक पुस्तक में प्रतिलिपि बनाता है, और यह परवाह नहीं करता कि पुस्तक कहां से आती है। –

उत्तर

7

आमतौर पर आप ऑब्जेक्ट्स (डोमेन इकाइयों के डीटीओ प्रस्तुतियों) को सर्वर पर स्थानांतरित नहीं करते हैं। क्योंकि यदि आप ऐसा करते हैं तो आप encapsulation तोड़ते हैं क्योंकि कोई भी डीटीओ में परिवर्तन लागू कर सकता है और फिर जानकारी वापस भेज सकता है।

इसके बजाय आप एक सेवा इंटरफ़ेस जो वस्तुओं को संशोधित करने के लिए किया जाता है बनाना चाहिए यह सर्वर यह मॉडल है परिवर्तन लागू करने की अनुमति देता है के बाद से।

  1. एक क्वेरी हिस्सा जो सभी संस्थाओं
  2. एक कमांड हिस्सा जो संस्थाओं
  3. में परिवर्तन लागू करने के लिए इस्तेमाल किया जाता है के डीटीओ अभ्यावेदन लाने के लिए प्रयोग किया जाता है:

    तो सेवा वास्तव में दो भागों में ऊपर splitted है

+1

अच्छा जवाब। मैं सहमत हूँ। हालांकि, मुझे लगता है कि जो भी आप सर्वर पर वापस भेजते हैं वह अभी भी एक डीटीओ है। अंतर यह है कि आप किसी डोमेन इकाई पर डीटीओ को वापस मैप नहीं करते हैं। इसके बजाए, जैसा कि आप कहते हैं, डीटीओ उस आदेश का प्रतिनिधित्व करता है जिसे आप मौजूदा इकाई पर लागू करना चाहते हैं। नई संस्थाओं को बनाने वाले आदेशों के लिए, डीटीओ कहा गया इकाई बनाने के लिए आवश्यक डेटा प्रदान करेगा। – eulerfx

+0

हाँ। मैं बस इतना कह रहा हूं कि आपको डोमेन इकाई में सभी जानकारी का प्रतिनिधित्व करने वाला डीटीओ नहीं भेजना चाहिए। – jgauffin

+1

हाँ, मुझे पता है कि आप सीकर्स के बारे में बात करते हैं..लेकिन इस समय, हमारे पास एक सीकर्स लागू नहीं है..तो..मेरे पास किताबों में बहुत सारी संपत्तियां हैं, इन संपत्तियों को सेवा इंटरफ़ेस में कैसे पास किया जाए? या मुझे 'updateName(), updateAuthor() .. updatexxx' जैसे इंटरफ़ेस प्रदान करना चाहिए और क्लाइंट इस इंटरफ़ेस को एक-एक करके कॉल कर सकता है? – tobato