मैं समझता हूं कि एमवीसी में अलग-अलग चिंताओं के लिए "उचित" संरचना आपके चुने हुए भंडार में बने रहने के लिए आपके विचारों और अलग-अलग डेटा-मॉडलों के निर्माण के लिए दृश्य-मॉडल होना है। मैंने मोंगोडीबी के साथ प्रयोग करना शुरू कर दिया और मुझे लगता है कि स्कीमा-कम, नो-एसक्यूएल स्टाइल डेटाबेस का उपयोग करते समय यह लागू नहीं हो सकता है। मैं इस परिदृश्य को स्टैक ओवरफ्लो समुदाय में पेश करना चाहता था और देख सकता हूं कि हर किसी के विचार क्या हैं। मैं एमवीसी के लिए नया हूं, इसलिए यह मुझे समझ में आया, लेकिन शायद मैं कुछ देख रहा हूं ...एमवीसी और एनओएसक्यूएल: दृश्य मॉडलों को सीधे मोंगोडीबी में सहेजना?
इस चर्चा के लिए मेरा उदाहरण यहां दिया गया है: जब कोई उपयोगकर्ता अपनी प्रोफ़ाइल संपादित करना चाहता है, तो वे UserEdit पर जाएंगे देखें, जो नीचे UserEdit मॉडल का उपयोग करता है।
public class UserEditModel
{
public string Username
{
get { return Info.Username; }
set { Info.Username = value; }
}
[Required]
[MembershipPassword]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
[DisplayName("Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
[Email]
public string Email { get; set; }
public UserInfo Info { get; set; }
public Dictionary<string, bool> Roles { get; set; }
}
public class UserInfo : IRepoData
{
[ScaffoldColumn(false)]
public Guid _id { get; set; }
[ScaffoldColumn(false)]
public DateTime Timestamp { get; set; }
[Required]
[DisplayName("Username")]
[ScaffoldColumn(false)]
public string Username { get; set; }
[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
public string LastName { get; set; }
[ScaffoldColumn(false)]
public string Theme { get; set; }
[ScaffoldColumn(false)]
public bool IsADUser { get; set; }
}
ध्यान दें कि UserEditModel क्लास में UserInfo का एक उदाहरण है जो आईरिपोडाटा से प्राप्त होता है? UserInfo डेटाबेस में सहेजा जाता है। मेरे पास एक सामान्य भंडार वर्ग है जो किसी भी वस्तु को स्वीकार करता है जो विरासत में आईआरपीओडेटा बनाता है और इसे बचाता है; तो मैं बस Repository.Save(myUserInfo)
पर कॉल करता हूं और यह किया जाता है। आईरिपोडाटा _id (मोंगोडीबी नामकरण सम्मेलन) और एक टाइमस्टैम्प को परिभाषित करता है, इसलिए भंडार _id के आधार पर अपरिवर्तित हो सकता है और टिमस्टैम्प के आधार पर संघर्षों की जांच कर सकता है, और ऑब्जेक्ट जो भी अन्य गुणों को मोंगोडीबी में सहेजा गया है। अधिकांश भाग के लिए दृश्य को केवल @Html.EditorFor
का उपयोग करने की आवश्यकता है और हम जाने के लिए अच्छे हैं! असल में, जो कुछ भी दृश्य दृश्यों को बेस-मॉडल में जाता है, कुछ भी जो केवल भंडार की जरूरत है, केवल [ScaffoldColumn(false)]
एनोटेशन प्राप्त करता है, और बाकी सब कुछ दोनों के बीच आम है। (Btw - उपयोगकर्ता नाम, पासवर्ड, भूमिका, और ईमेल, .NET प्रदाताओं के लिए सहेज इतना है कि क्यों वे UserInfo वस्तु में नहीं हैं।)
बड़ा लाभ इस परिदृश्य के दो गुना कर रहे हैं ...
मैं कम कोड है, जो इसलिए अधिक आसानी से समझा है, तेजी से विकसित करने के लिए, और अधिक maintainable है (मेरी राय में) का उपयोग कर सकते हैं।
मैं फिर से कारक सेकंड में ... मैं एक दूसरे ईमेल पता जोड़ने की जरूरत है, मैं सिर्फ यह UserInfo वस्तु में जोड़ने - यह दृश्य में जोड़ा और भंडार करने के लिए सहेजा जाता है बस जोड़कर वस्तु के लिए एक संपत्ति। क्योंकि मैं MongoDB का उपयोग कर रहा हूं, मुझे किसी भी मौजूदा डेटा के साथ मेरी डीबी स्कीमा या गड़बड़ को बदलने की आवश्यकता नहीं है।
इस सेटअप को देखते हुए, डेटा संग्रह करने के लिए अलग-अलग मॉडल बनाने की आवश्यकता है? आप सभी को क्या लगता है कि इस दृष्टिकोण के नुकसान हैं? मुझे एहसास है कि स्पष्ट उत्तर मानकों और अलगाव की चिंताओं हैं, लेकिन क्या कोई वास्तविक दुनिया उदाहरण हैं जो आप सोच सकते हैं कि इससे कुछ सिरदर्द पैदा होंगे?
यह भी ध्यान देने योग्य है कि मैं दो डेवलपर्स की एक टीम पर काम कर रहा हूं, इसलिए लाभों को देखना और कुछ मानकों को झुकाव करना आसान है। क्या आपको लगता है कि एक छोटी टीम पर काम करने से उस संबंध में कोई फर्क पड़ता है?
मैं मूल रूप से सहमत हूं। पांचवें अनुच्छेद में, शायद आपको यह इंगित करना चाहिए कि मॉडल बाध्यकारी समस्या का कारण है (यानी सही नाम वाले प्रत्येक फ़ील्ड को बाध्य किया जाएगा), और मॉडल बाध्यकारी को कुछ क्षेत्रों को अनदेखा करने के लिए भी कॉन्फ़िगर किया जा सकता है - भले ही मैं मानूं वह खतरनाक है। चूंकि मैपिंग कोड उबाऊ और त्रुटि-प्रवण है, इसलिए ऑटोमैपर को ViewModels से और उसके लिए मानचित्र करना अच्छा विचार हो सकता है। – mnemosyn
आह अच्छा बिंदु, मैं इसे जोड़ दूंगा। और मैं इस बात से सहमत हूं कि ऑटोमैपर शायद इसे मैन्युअल रूप से करने के बजाय दृश्य मॉडल में कनवर्ट करने का बेहतर समाधान है। – KallDrexx
वाह, मेरे लिए उस सुप्रसिद्ध उत्तर को बनाने के लिए समय निकालने के लिए धन्यवाद! – jrizzo