2012-06-26 27 views
5

के लिए मॉडल के बजाय व्यूमोडल्स का उपयोग करने में संकोच कर रहा हूं, गीलेर मैं ऑटोमैपर का उपयोग करता हूं या मैन्युअल रूप से मैपिंग करता हूं, जो कोई भूमिका निभाता है।मैं अभी भी

रिलीज़ व्यू मॉडेल के लिए सभी डेटा रिलीज में सबसे पहले होना चाहिए क्योंकि यह डेटा एक्सेस लेयर में भरा हुआ है। मेरे मॉडल का 9 0% इस तरह है। सबकुछ डुप्लिकेट करने का ऊपरी भाग क्यों?

केआईएसएस सिद्धांत और अधिक इंजीनियरिंग के बारे में क्या?

बेशक इसके उचित कार्य के लिए हर उपकरण, लेकिन अक्सर मैं SO पर पढ़ता हूं कि एएसपीनेट एमवीसी में व्यूमोडल्स का उपयोग नहीं करना एक नो-गो है।

लाइन कहां आकर्षित करें? क्या मुझे ViewModels का उपयोग करना चाहिए जब वे मेरे मॉडल से 50%, 75% या 99% को अलग करते हैं?

public class Release 
    {  
     public int Id { get; set; }  
     public string Name { get; set; } 
     public string Author { get; set; } 
     public DateTime CreatedAt { get; set; } 
     public int FailedTestsCount { get; set; } 
     public int SucceededTestsCount { get; set; } 
     public int SumTestsCount 
     { 
      get 
      { 
       return SucceededTestsCount + FailedTestsCount; 
      } 
     } 
     public int SumTestingTime { get; set; } 
    } 

एक viewmodel ReleaseViewModel:

public class ReleaseViewModel 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Name must not be empty.")] 
    [StringLength(30, ErrorMessage = "Enter max. 30 chars for a name.")] 
    [Remote("ReleaseExists", "Release", ErrorMessage = "This name already exists.")] 
    public string Name { get; set; }  
    public string Author { get; set; }  
    public DateTime CreatedAt { get; set; }  
    public int FailedTestsCount { get; set; }  
    public int SucceededTestsCount { get; set; }  
    public int SumTestsCount 
    { 
     get 
     { 
      return SucceededTestsCount + FailedTestsCount; 
     } 
    } 

    public int SumTestingTime { get; set; } 
} 
+0

अपने रिहाई वर्ग एक डीटीओ है या यह कार्यशीलता के साथ एक डोमेन वस्तु है? – Jupaol

+0

इसकी एक डोमेन वस्तु है। मेरे पास एक डीटीओ की आवश्यकता रखने के लिए कई परतें नहीं हैं। – Pascal

+0

आप क्यों नहीं चाहते हैं कि आपके डोमेन मॉडल में नाम आवश्यक हो और 30 से कम हो? जबकि आपका डोमेन मॉडल उपयोगकर्ता को एक सुंदर संदेश नहीं दिखा सकता है, फिर भी मॉडलस्टेट.इस्वालिद गलत होने पर यह प्रक्रिया करने से इंकार कर सकता है। कम से कम मुझे लगता है कि आपको यह करना चाहिए, लेकिन मैं एक नौसिखिया –

उत्तर

5

ViewModel कुछ ऐसा है जो VIEW के लिए है। अधिकांश समय यह आपके इकाई मॉडल के समान होता है। लेकिन हमेशा नहीं।

अपना उदाहरण देखें। आपके ViewModel में, आपके पास Remote विशेषता और कुछ सत्यापन विशेषताएँ हैं। तो यह रिमोट नाम जांच वह है जो आप अपने उपयोगकर्ता को बेहतर उपयोगकर्ता अनुभव देने के लिए जोड़ते हैं। यह दृश्य के लिए विशिष्ट है।

एक और परिदृश्य जो आपको एक व्यूमोडेल की आवश्यकता है स्क्रीन के लिए है जहां आपके पास एक से अधिक मॉडल शामिल हैं। पूर्व: आपके पास User इकाई और Project इकाई है और आप एक स्क्रीन प्रदान करना चाहते हैं जहां किसी उपयोगकर्ता को कोई परियोजना जोड़ा जा सके। इस मामले में तो, आप को संभालने के लिए कि

public class ProjectToUserVM 
{ 
    public int UserId { set;get;} 
    public string UserName { set;get;} // i want to display only name of user! 
    public int ProjectID { set;get;} 
    public IEnumerable<SelectListItem> Projects { set;get} 
} 

अपने सभी मॉडल संस्थाओं के लिए ViewModels का उपयोग न करें एक viewmodel बना सकते हैं। इसे बनाएं जब आपके दृश्य को वास्तव में इसकी आवश्यकता हो। मैं कभी-कभी व्यूमोडेल बनाये बिना कुछ मॉडल में अपनी मॉडल इकाई ऑब्जेक्ट्स का उपयोग करता हूं क्योंकि ये बिल्कुल समान हैं। पूर्व: देश/राज्य/शहर (तालिका डेटा देखें। कोई भी जोड़ें/संपादित करें)

+0

टिप्पणी का क्या अर्थ है "मैं केवल उपयोगकर्ता का नाम दिखाना चाहता हूं!" ?? और हाँ रिमोट सत्यापन एमवीसी नेमस्पेस से संबंधित है, लेकिन हैई मैं एक एमवीसी एप्लीकेशन कर रहा हूं इसलिए यह युग्मन पूरी तरह से ठीक है। कभी कभी मैं SelectListItem वर्ग महसूस कर viewmodel सेनानियों के शीर्ष तर्क इसकी एक MVC अनुप्रयोग है हमें नश्वर उपयोगकर्ता बताने के लिए हम और एक viewmodel मॉडल MVC से मजबूती से बंधे है की जरूरत है, लेकिन फिर से की है। मुझे लगता है कि सभी एंटरप्राइज़ ऐप्स का 99% अपने डोमेन को किसी अन्य एप्लिकेशन में पुन: उपयोग नहीं करते हैं जैसे Winforms/wpf इस प्रकार वेब.एमवीसी नेमस्पेस मेरी राय में मॉडल में ठीक है। – Pascal

+0

मुझे यह टिप्पणी सबसे अधिक पसंद आया: "इसे बनाएं जब आपका दृश्य वास्तव में इसकी आवश्यकता हो।" मैं ऐसा करूँगा और जैसा कि मैं इसे बहुत ही कम करता हूं, मैं इसे मैन्युअल रूप से करता हूं। कम असेंबली ओवरहेड। कम युग्मन ;-) – Pascal

+0

@Pascal: यह टिप्पणी का मतलब है, मेरे ViewModel में, मैं गुण जो absoluteky मेरे विचार में की जरूरत हैं होगा। मेरी मॉडल इकाई (तालिका कॉलम) की सभी गुण नहीं – Shyju

1

मेरे ViewModels बस एक मॉडल लपेट, और यह करने के लिए प्रतिनिधि समय के 90%

मैं एक मॉडल रिलीज की है। जब उन्हें विशिष्ट दृश्य उपयोग मामले के लिए मॉडल के व्यवहार के बारे में कुछ बदलने की आवश्यकता होती है तो उनके पास केवल स्वयं का व्यवहार होता है। वीएम होने के कारण वास्तव में व्यवहार को जोड़ने के लिए यह बहुत आसान हो जाता है जिसे केवल प्रदर्शन उद्देश्यों के लिए जरूरी है, खासकर यदि वह व्यवहार आपके दृढ़ता मॉडल में हस्तक्षेप करेगा (उदाहरण के लिए गुणों को जोड़ना जारी रखना चाहते हैं)।

यह ध्यान देने योग्य भी है कि फ्लाई पर डिफ़ॉल्ट अग्रेषण व्यवहार उत्पन्न करने के लिए कैसल या स्प्रिंगफ्रेमवर्क.net जैसे आईओसी उपकरण का उपयोग करना संभव है, जो आपको हाथ से लिखने के लिए आवश्यक कोड की मात्रा को कम करता है। यह "नकल लागत" को काफी नाटकीय रूप से कम कर देता है, इसलिए यह उतना बुरा नहीं है जितना कि पहले लगता है।

+0

"उदा। वे गुण जोड़ना जिन्हें आप लगातार नहीं चाहते हैं)।" तो उन्हें जारी मत करो ?! मैं एक ORMapper का उपयोग नहीं करता। "मेरा व्यू मॉडेल बस एक मॉडल लपेटता है, और उस समय 90% प्रतिनिधि देता है।" आप इसे एमवीवीएम पैटर्न में पसंद करते हैं? वह मुझे आश्चर्यचकित करता है। http://stackoverflow.com/questions/11213644/is-the-viewmodel-in-asp-net-comparable-to-the-viewmodel-in-wpf – Pascal

+0

मुझे लगता है मैं MVVM की तरह कुछ का उपयोग करते हैं। मुझे हमेशा 'शुद्ध' एमवीसी के साथ एक समस्या है, और मुझे एमवीवीएम प्रतिमान अधिक प्राकृतिक लगता है (यहां तक ​​कि एएसपी.नेट एमवीसी के लिए भी)। वाईएमएमवी :-) –

2

सबकुछ डुप्लिकेट करने का ओवरहेड क्यों?

सबसे पहले, आप सोच सकते हैं मैं कोड डुप्लिकेट रहा हूँ, लेकिन तथ्य यह है कि आप नहीं कर रहे हैं, इस स्थिति में आप क्या कर रहे हैं, तो आप एक गंभीर डिजाइन समस्या

मेरे पास है पाया है कि जब आप इसका पालन नहीं करते हैं, तो यह वास्तव में सभी बुराइयों की जड़ है: एसआरपी (एकल उत्तरदायित्व सिद्धांत)

शायद क्योंकि आपको अभी तक समस्या नहीं मिली है, या शायद, आपके पास है और आप बस अपना कोड पैच किया है। आपके डोमेन ऑब्जेक्ट की ज़िम्मेदारी पूरी तरह से उपयोगकर्ता को डेटा पेश करने की ज़िम्मेदारी से अलग है।

MVC में एक मॉडल, एक वर्ग सभी डेटा दृश्य प्रस्तुत करने के लिए की जरूरत है और अधिक कुछ भी नहीं का प्रतिनिधित्व होना चाहिए। आपको इस मॉडल को अपने डोमेन से डेटा के साथ पॉप्युलेट करने की आवश्यकता है। (या आपकी क्वेरी सेवाओं से सीक्यूआरएस आर्किटेक्चर में)

यदि आप एक सीक्यूआरएस आर्किटेक्चर का पालन करते हैं (कम से कम मूल बातें, आपको ईवेंट सोर्सिंग को लागू करने की आवश्यकता नहीं है और न ही अपने प्रश्नों को अपने प्रश्नों से अलग करने के लिए सेवा बस का उपयोग करने की आवश्यकता नहीं है), यह आपके लिए स्पष्ट होगा, एक क्वेरी ऑब्जेक्ट की ज़िम्मेदारी कमांड ऑब्जेक्ट (आपके डोमेन से एक एक्शन) से पूरी तरह से अलग है

मुझे लगता है कि आपने केआईएसएस सिद्धांत को गलत समझा है, जबकि यह आपके इंजीनियरिंग के बारे में बोलता है कोड या YAGNI, इसका मतलब यह नहीं है कि आपको पुन: उपयोग करना है आपके आवेदन में सब कुछ

मेरा विश्वास करो, मैंने सीखा यह खराब तरीका = (डोमेन कोड के बारे में बात करते समय, एकमात्र कोड जिसे पुन: उपयोग किया जाना चाहिए, बुनियादी संरचना कोड है, हमेशा एसआरपी

+0

"इसका मतलब यह नहीं है कि आपको अपने आवेदन में सब कुछ पुन: उपयोग करना है" DRY। – Pascal

+0

आप डीआरवाई सिद्धांत को तोड़ नहीं रहे हैं ... मैं वहां गया हूं ... आपको केवल ** भूमिका ** को समझने की आवश्यकता है प्रत्येक घटक खेल रहा है। जैसे ही आप इसे समझते हैं, और जैसे ही आप सीखते हैं ** भूमिकाओं को स्पष्ट बनाते हैं ** आप सुरंग के अंत में प्रकाश देखेंगे। उडी दहन से कुछ लेख पढ़ें। मैंने इस चर्चा को कई बार देखा है और रूट हमेशा एक ही है ... डिजाइन सिद्धांत की कमी। और अगर आप इस दृष्टिकोण तुम सीखना होगा (जैसे मैंने किया था) इस बुरी तरह से पालन करने के लिए जोर देते हैं ... मुझे लगता है कि आप _Silver गोली सिंड्रोम ..._ – Jupaol

+0

में गिर रहे हैं मुझे पता है तुम क्यों कहा था कि यह सूखी नष्ट नहीं होती है। क्योंकि आप यहां एसआरपी के साथ डीआरवाई को "प्रतिस्थापित" करते हैं। हां ViewMOdel दृष्टिकोण हमेशा एसआरपी की मांग करता है। लेकिन मैं इसे व्यावहारिक रखने और वर्तमान आवश्यकताओं को रखने के लिए इसे सरल रखना पसंद करता हूं। स्वच्छ संहिता कहती है कि यदि आप 90% की संभावना नहीं रखते हैं तो आपको इंजीनियर नहीं करना चाहिए। यह वास्तविक जीवन व्यावहारिक है जिसे आप समझते हैं? मुझे लगता है कि आप इसे बहुत चरम लेते हैं। आपने वास्तव में बुरा तरीका सीखा है कि वास्तव में आपके पास एक बड़ा एंटरप्राइज़ एप्लिकेशन होना चाहिए। हमारे पास 150K LOC asp.net/wcf ऐप है लेकिन व्यूमोडेल के लिए लगभग कोई आवश्यकता नहीं है। – Pascal

0

मैं दूसरा सबकुछ श्याजू कहता हूं, विशेष रूप से "जब आपको आवश्यकता हो यह "।

यदि आपके पास एक बहुत ही सरल परियोजना है जहां आपकी EntityModel कक्षाएं आपके व्यूमोडेल कक्षाओं के समान लाइब्रेरी में हैं, तो आपको अलग-अलग ViewModel dto के लिए कोई आवश्यकता नहीं हो सकती है और उन्हें छोड़ सकते हैं। मुझे नहीं लगता कि बुद्धिमान व्यक्ति आपको यह बताने जा रहा है "आपने यह गलत किया क्योंकि आप अपने दृश्य मॉडल, डमस के लिए इकाई कक्षाओं का उपयोग कर रहे हैं।" हम नहीं जानते कि आपके आवेदन का संदर्भ क्या है। यह आपके मामले में पूरी तरह से उपयुक्त हो सकता है।

हम में से कुछ गैर-वेब असेंबली में एंटीटी मॉडल को परिभाषित करते हैं - केवल एक सादा वर्ग लाइब्रेरी जो डीएलएल में संकलित होती है - बड़ी परियोजनाओं के लिए। जब ऐसा होता है, तो हमें अक्सर आपके विशेष प्रश्न में रिमोटएट्रिब्यूट और छुपे हुए इनपुट एट्रिब्यूट जैसे दृश्य में विशेष विशेषताओं को लागू करने की आवश्यकता होती है। हालांकि अलग-अलग व्यूमोडेल डीटीओ परत का उपयोग किये बिना ऐसा करने का मतलब है कि हमें System.Web.Mvc.dll को EntityModel लाइब्रेरी में संदर्भ जोड़ना होगा, वास्तव में में लाइब्रेरी के पास वेब से कुछ और नहीं करना है।

बस ध्यान रखें कि जब आप अपने वेब परियोजनाओं में EntityModel वर्गों पुन: उपयोग कर रहे हैं (यानी उन दोनों भंडारण मॉडल और प्रस्तुति मॉडल के रूप में उपयोग करते हुए), आप अपने प्रोजेक्ट की वेब पहलुओं और के व्यापार पहलुओं के बीच एक तंग युग्मन पैदा कर रहे आपका प्रोजेक्ट। यदि आप लागत/बजट, समय, लक्षित दर्शकों, दायरे, या अन्य बाधाओं के कारण इसे उचित ठहरा सकते हैं, तो इसे करें, और अपने आलोचकों को अनदेखा करें क्योंकि वे आपके जैसा चित्र जितना बड़ा नहीं देख रहे हैं।

0

यदि आपकी रिलीज क्लास INOTifyPropertyChanged लागू करती है और आपके दृश्य (सत्यापन, आदेश, ...) के लिए आपको आवश्यक सभी अन्य सामग्री तब आपको व्यूमोडेल का उपयोग करने की आवश्यकता नहीं है।लेकिन यदि नहीं ...

+0

मेरी रिलीज क्लास एएसपीएनटी एमवीसी एप्लीकेशन में प्रयोग की जाती है। INotifyProperty क्यों किया जाना चाहिए? – Pascal

+0

ओह क्षमा नहीं किया कि कोई WPF टैग नहीं है – blindmeis

संबंधित मुद्दे