8

मैं निम्नलिखित डोमेन मॉडल हैक्या डीटीओ ने डीटीओ को घोंसला दिया है?

public class Playlist 
{ 
    public long Id { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<Song> Songs { get; set; } 
} 

public class Song 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public virtual Playlist Playlist { get; set; } 
    public virtual ICollection<Catalog> Matches { get; set; } 
} 

public class Catalog 
{ 
    public long Id { get; set; } 
    public string Title { get; set; } 
} 

मेरी सेवा निम्नलिखित कोड है:

public PlaylistResult FindByPlaylistId(long id) 
{ 
    Playlist playlist = playlistRepository.GetById(id); 

    foreach (var song in playlist.Songs) 
    { 
     song.Matches = catalogRepository.GetMatches(song.Name).ToList(); 
    } 

    return new PlaylistResult(new PlaylistDTO(playlist), playlist.Songs.Select(x => new SongDTO(x))); 
} 

मेरी सेवा प्लेलिस्ट में प्रत्येक गीत के लिए डेटाबेस से किसी प्लेलिस्ट और गाने और हो जाता है तो यह आग उस गीत के लिए विशिष्ट डेटाबेस (SQL सर्वर पूर्ण पाठ खोज का उपयोग करके) से अतिरिक्त मिलान प्राप्त करने के लिए एक क्वेरी।

डेटा को फिर डीटीओ में परिवर्तित किया जाता है, परिणाम ऑब्जेक्ट में जोड़ा जाता है और नियंत्रक को वापस भेज दिया जाता है। कोड लगता है:

public class PlaylistResult 
{ 
    public PlaylistResult(PlaylistDTO playlist, IEnumerable<SongDTO> songs) 
    { 
     Playlist = playlist; 
     Songs = songs; 
    } 

    public PlaylistDTO Playlist { get; private set; } 

    public IEnumerable<SongDTO> Songs { get; private set; } 
} 

समस्या:

PlaylistResult वस्तु अब तक महान काम किया है लेकिन मैचों के हाल ही के परिचय में थोड़ा और अधिक जटिल बातें बना दिया है। ऐसा लगता है कि मैं संशोधित करने के लिए की तुलना में मेरी SongDTO खाता मैचों में लेने के लिए और इस तरह देखने के लिए कोई अन्य विकल्प नहीं है:

public class SongDTO 
{ 
    public SongDTO(Song song, IEnumerable<CatalogDTO> matches) 
    { 
     Id = song.Id; 
     Name = song.Name; 
     Matches = matches; 
    } 

    public long Id { get; private set; } 

    public string Name { get; private set; } 

    public IEnumerable<CatalogDTO> Matches { get; private set; } 
} 

लेकिन इस डीटीओ के उद्देश्य का उल्लंघन नहीं करता? यह मेरी समझ है कि डीटीओ डेटा का एक स्पष्ट प्रतिनिधित्व है और यह दृष्टिकोण चपटा नहीं है। दूसरी तरफ, मैं नहीं देखता कि यह कैसे करना है क्योंकि प्रत्येक मैच प्रत्येक गीत के लिए विशिष्ट है।

मुझे पता है कि मैं इसे अपने आप को आसान बना सकता हूं और डीटीओ को बाहर निकाल सकता हूं और डोमेन मॉडल को सीधे नियंत्रक को पास कर सकता हूं और इसे एक दिन कॉल कर सकता हूं। लेकिन मैं ऐसा नहीं करना चाहता क्योंकि पूरा उद्देश्य डीटीओ के साथ काम करना सीखना है।

किसी भी इनपुट की बहुत सराहना की जाती है।

+0

ध्यान रखें कि आप एक एनीमिक डोमेन मॉडल बना रहे हैं। आप डोमेन ऑब्जेक्ट्स किसी भी व्यवहार का पर्दाफाश नहीं कर रहे हैं - यह केवल सार्वजनिक गेटर्स और सेटर्स (जो खतरनाक है) है। – hoetz

+0

मैंने उदाहरण के लिए इसे सरल रखा। – Thomas

उत्तर

8

डीटीओ डेटा के एक स्पष्ट प्रतिनिधित्व नहीं हैं हालांकि वे हो सकते हैं।

यह उनकी सुंदरता है - डेटाबेस की चीजों को परिभाषित करने के तरीके के विपरीत, आप उनकी संरचना के रूप में उन्हें संरचना कर सकते हैं। इसके अलावा वे व्यवहार से डेटा को अलग करने का साधन हैं।

मैं डीटीओ के भीतर डोमेन ऑब्जेक्ट का संदर्भ नहीं डालूंगा। (आपके पास यह कन्स्ट्रक्टर में है) डीटीओ बनाने के लिए एक कारखाने का उपयोग करें ताकि आपके क्लाइंट को केवल डीटीओ के संदर्भ की आवश्यकता हो, न कि डोमेन ऑब्जेक्ट्स।

Song mySong; 
SongDTO = DTOFactory.GetSong(mySong); 

यदि आपके क्लाइंट को डोमेन ऑब्जेक्ट्स का संदर्भ देने की आवश्यकता है, तो वे भी उनका उपयोग कर सकते हैं!

+0

धन्यवाद। तो दूसरे शब्दों में, घोंसले डीटीओ एक स्वीकार्य दृष्टिकोण है? – Thomas

+2

बिल्कुल - बस डोमेन ऑब्जेक्ट्स के साथ डीटीओ मिश्रण और मिलान न करें! – BonyT

0

आपने जो किया है वह सही है। मुझे लगता है कि जब आप अपने आवेदन की डेटा परत से डेटा पास कर रहे होते हैं तो वे अनिवार्य रूप से प्रक्षेपित होते हैं।