10

के साथ डेटा एनोटेशन का उपयोग करते समय यदि आप this article on Validation with the Data Annotation Validators पढ़ते हैं, तो यह दिखाता है कि आप आंशिक कक्षाओं पर गुणों को सत्यापन गुण जोड़ने के लिए मेटाडेटा टाइप प्रकार का उपयोग कर सकते हैं। LINQ से SQL, Entity Framework, या Subsonic जैसे ORMs के साथ काम करते समय आप इसका उपयोग करते हैं। फिर आप "automagic" क्लाइंट और सर्वर साइड सत्यापन का उपयोग कर सकते हैं। यह एमवीसी के साथ बहुत अच्छी तरह से खेलता है।एमवीसी, प्रो और एक इंटरफेस बनाम एक मेटाडेटा टाइप

हालांकि, मेरे एक सहयोगी ने एक ही परिणाम को पूरा करने के लिए एक इंटरफ़ेस का उपयोग किया। यह लगभग बिल्कुल वही दिखता है, और कार्यात्मक रूप से एक ही चीज़ को पूरा करता है। तो बजाय ऐसा करने का:

[MetadataType(typeof(MovieMetaData))] 
public partial class Movie 
{ 
} 

public class MovieMetaData 
{ 
    [Required] 
    public object Title { get; set; } 

    [Required] 
    [StringLength(5)] 
    public object Director { get; set; } 


    [DisplayName("Date Released")] 
    [Required] 
    public object DateReleased { get; set; } 
} 

वह इस किया था:

public partial class Movie :IMovie 
{ 
} 

public interface IMovie 
{ 
    [Required] 
    object Title { get; set; } 

    [Required] 
    [StringLength(5)] 
    object Director { get; set; } 


    [DisplayName("Date Released")] 
    [Required] 
    object DateReleased { get; set; } 
} 

तो मेरे सवाल है, जब इस अंतर को वास्तव में कोई फर्क पड़ता है है?

मेरे विचार यह है कि इंटरफेस अधिक "पुन: प्रयोज्य" होते हैं, और यह कि केवल एक वर्ग के लिए एक बनाना बहुत अधिक समझ में नहीं आता है। आप यह भी तर्क दे सकते हैं कि आप अपने वर्गों और इंटरफेस को ऐसे तरीके से डिज़ाइन कर सकते हैं जो आपको कई ऑब्जेक्ट्स पर इंटरफेस का उपयोग करने की अनुमति देता है, लेकिन मुझे लगता है कि यह आपके मॉडल को किसी अन्य चीज़ में फिट करने की कोशिश कर रहा है, जब उन्हें वास्तव में स्वयं पर खड़ा होना चाहिए। तुम क्या सोचते हो?

+0

मैंने बिल्कुल यह किया और यह काम नहीं किया ...: -एस – Alxandr

उत्तर

3

मुझे आपका इंटरफ़ेस दृष्टिकोण पसंद है क्योंकि यह आपको अपने मॉडल के लिए एक अनुबंध परिभाषित करने की अनुमति देता है जिसका उपयोग आप अपने ओआरएम जेनरेटेड क्लास को अनुकूलित करने के लिए कर सकते हैं। इससे आप अपने ऐप को ओआरएम ढांचे से डीक्यूपल कर सकते हैं और मेटाडेटा टाइप इंटरफ़ेस से अधिक उपयोग प्राप्त कर सकते हैं क्योंकि यह डेटा सत्यापन मेटाडेटा के साथ-साथ आपके मॉडल के लिए अनुबंध के रूप में कार्य करता है। इंटरफ़ेस से अधिक उपयोग प्राप्त करने के लिए आप डब्ल्यूसीएफ में उपयोग के लिए सीरियलाइजेशन विशेषताओं के साथ अपने इंटरफ़ेस को भी सजाने सकते हैं। मैंने कुछ शुरुआती ब्लॉगों का पालन किया जिसने मेटाडेटा कक्षा बनाने की सिफारिश की लेकिन फिर मुझे लगता है कि इंटरफ़ेस समाधान एक अच्छा विचार है।

+0

मैं सहमत हूं। असल में डेटा एनोटेशन ने मुझे हमेशा असहज महसूस किया है क्योंकि मुझे लगा है कि यूआई सामान ने उन्हें मॉडल पर डालने के कारण चिंताओं को अलग करने का उल्लंघन किया है। एनोटेटेड इंटरफेस का उपयोग उन चिंताओं को दूर करने का एक लंबा रास्ता तय करता है। –

1

मुझे दो दृष्टिकोणों के बीच कोई कार्यात्मक अंतर दिखाई नहीं देता है। मुझे यकीन नहीं है कि पुन: प्रयोज्यता वास्तव में यहां महत्वपूर्ण है, यह देखते हुए कि सत्यापन अक्सर "वन-ऑफ" व्यू मॉडल्स पर होगा जो शायद अधिक नहीं होगा, यदि कोई हो, तो पुन: उपयोग करें।

2

यदि उन दो विकल्पों में से दो हैं, तो मैं व्यक्तिगत रूप से इंटरफ़ेस तरीका चुनता हूं, क्योंकि मुझे लगता है कि यह क्लीनर दिखता है। लेकिन यह पूरी तरह से व्यक्तिगत स्वाद पर आधारित है - मुझे निश्चित रूप से कहने के लिए .NET की आंतरिक कार्यप्रणाली के बारे में पर्याप्त जानकारी नहीं है, लेकिन मुझे कोई भी मामला नहीं पता है जहां दो दृष्टिकोणों की वास्तविक कार्यक्षमता अलग-अलग होगी।

दूसरी तरफ, डाटा ट्रांसफर ऑब्जेक्ट्स (डीटीओ) का डेटा आगे और आगे भेजने के लिए एक बेहतर तरीका होगा, और उनके पास सत्यापन आवश्यकताएं होंगी। यही है, Movie ऑब्जेक्ट की सभी सत्यापन आवश्यकताओं को पूरा करने की आवश्यकता के बजाय, आपको MovieInput ऑब्जेक्ट की आवश्यकता होती है, और फिर MovieInput को Movie में सही करने के लिए कोड बनाएं। (यदि आप इसे मैन्युअल रूप से नहीं करना चाहते हैं, तो आप AutoMapper या कुछ अन्य उपयोगिता का उपयोग कर सकते हैं)।

अवधारणा रास्ता में पर बस के रूप में अच्छी तरह से जिस तरह से पर के रूप में बाहर एक दृश्य मॉडल वस्तु की तरह कुछ है करने के लिए मूल रूप से है - मैं तो बस के रूप में अच्छी MovieInputMovieViewModel कहा जा चलो और के स्थानांतरित करने के लिए इसका इस्तेमाल करते हैं हो सकता था सर्वर के अंदर और बाहर डेटा दोनों।

+0

तो यदि आपके पास यूआई और "दृढ़ता" परत के बीच एक मुखौटा था, और आपने इन डीटीओ को विचारों में पूरी तरह से हटा दिया, तो आप अधिक जटिल सत्यापन (व्यवसाय नियम) कहां डालते हैं और एकीकृत करते हैं? डीटीओ में 'IValidateableObject' लागू करें? यह गलत लगता है ... क्योंकि सब कुछ, हम इसे एकीकरण बिंदु एमवीसी प्रदान करते हुए यूआई को वापस जोड़ना चाहते हैं (और डाटानोटेशन और ivalidateableobject भी एमवीसी के बाहर इस्तेमाल किया जा सकता है)। – kamranicus

+0

@subkamran: मुझे यहां दो संभावित परिदृश्य दिखाई देते हैं। 1) यूआई के बावजूद आपको बिल्कुल वही इनपुट चाहिए। इस मामले में, यूआई परत को एक सामान्य डीटीओ को चालू करने के लिए आवश्यक होना चाहिए, जहां सत्यापन नियम लागू किए जा सकते हैं, और यूआई परत के बावजूद डीटीओ का उपयोग किया जा सकता है। 2) व्यापार परत में एक ही प्रकार की वस्तु का उत्पादन करने के लिए विभिन्न यूआई परतों में इनपुट अलग होगा। इस मामले में, आपको यूआई विशिष्ट डीटीओ की आवश्यकता होगी, लेकिन सत्यापन नियम अभी भी डीटीओ पर लागू किए जा सकते हैं - क्योंकि इनपुट आवश्यकताएं अलग हैं, सत्यापन नियम भी हैं। तो आप हमेशा अपने डीटीओ पर मान्य कर सकते हैं। –

+0

मैं आपके तर्क को समझता हूं और यह समझ में आता है, लेकिन क्या मैं सभी जावास्क्रिप्ट एकीकरण को खो दूंगा? क्योंकि अक्सर नहीं, मेरे विचार ऑब्जेक्ट के गुणों (एक डीटीओ) के सबसेट के साथ सौदा करते हैं, लेकिन पूरी तरह से दृश्य के लिए असंबंधित गुणों के साथ (चुनिंदा सूचियों के लिए एक शब्दकोष देखें)। इसलिए मैं वास्तव में उन लोगों को अपनी सेवा से इनपुट के रूप में स्वीकार नहीं कर सकता क्योंकि उनके पास आवश्यक संपत्तियां हैं जिनकी मुझे परवाह नहीं है। संभवतः, मैं इन डीटीओ से प्राप्त कर सकता हूं, और एमवीसी व्यू खपत के लिए उनमें से ViewModels बना सकता हूं। यह सिर्फ चारों ओर तैरने वाली और वस्तुएं बनाता है लेकिन शायद यह ठीक है? – kamranicus

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