2011-06-16 5 views
9

मेरे ASP.NET MVC साइट एक WCF सेवा से कनेक्ट करता है डेटा प्राप्त करने के। WCF सेवा इस तरह एक डेटा अनुबंध रिटर्न:ASP.NET MVC दृश्य मॉडल सर्वोत्तम प्रथाओं

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string First { get; set; } 

    [DataMember] 
    public string Last { get; set; } 
} 

मेरी MVC परियोजना में दृश्य मॉडल इस तरह दिखता है:

public class MyViewModel 
{ 
    public string SomeExtraField1 { get; set; } 
    public string SomeExtraField2 { get; set; } 
    public string SomeExtraField3 { get; set; } 

    public Person Person { set; set; } 
} 

चाहिए मेरे विचार मॉडल "व्यक्ति" डेटा अनुबंध है कि लौटा दिया जाता है को संदर्भित किया डेटा सेवा से? या क्या मुझे अपनी एमवीसी परियोजना में एक नया "व्यक्ति" वर्ग बनाना चाहिए जो "व्यक्ति" डेटा अनुबंध पर गुणों को प्रतिबिंबित करता है?

WCF सेवा कॉल एक अंतरफलक के पीछे छिपा है। ऐसा लगता है कि इंटरफ़ेस संदर्भ डेटा अनुबंध होने से मेरा इंटरफ़ेस एक रिसाव अबास्ट्रक्शन बनाता है। हालांकि, मेरे पास कुछ ऐसे लोग हैं जो मेरे एमवीसी प्रोजेक्ट में एक अतिरिक्त "व्यक्ति" वर्ग बनाने पर विश्वास करते हैं जो डेटा अनुबंध को प्रतिबिंबित करता है कोड कोड ब्लोट।

सर्वोत्तम प्रथाओं लेयरिंग/decoupling के इस प्रकार के आसपास के कर रहे हैं कर रहे हैं क्या?

उत्तर

17

क्या मेरा व्यू मॉडल डेटा सेवा से वापस आने वाले "व्यक्ति" डेटा अनुबंध का संदर्भ लेना चाहिए?

नहीं, इससे बचें, यह डेवलपर्स को झूठी छाप दे रहा है कि वे दृश्य मॉडल का उपयोग कर रहे हैं। कोड समीक्षा करते समय मुझे अक्सर इस तरह का कोड दिखाई देता है:

public class MyViewModel 
{ 
    public SomeDomainModel1 Model1 { get; set; } 
    public SomeDomainModel2 Model2 { get; set; } 
    ... 
} 

और यह गलत है। जब मैं उन्हें देखने के मॉडल का उपयोग नहीं करने के लिए आलोचना वे मेरे इस दिखाने के लिए और मुझे बताओ: "डैरिन, देखो, मैं दृश्य मॉडल का उपयोग कर रहा", दुर्भाग्य है कि कैसे दृश्य मॉडल काम करने की अपेक्षा की जाती है। वे डोमेन मॉडल के चारों ओर रैपर नहीं हैं।

या मुझे अपने एमवीसी प्रोजेक्ट में एक नया "व्यक्ति" वर्ग बनाना चाहिए जो "व्यक्ति" डेटा अनुबंध पर गुणों को प्रतिबिंबित करता है?

हां, आप PersonViewModel बना सकते हैं और केवल उन गुणों को शामिल कर सकते हैं जिनकी आपकी ज़रूरत है।

या अगर विशेष दृश्य आप केवल कुछ गुण की जरूरत के लिए इस दृश्य मॉडल के डिजाइन कर रहे हैं तो आप भी कर सकता है यह इस तरह दिखेगा:

public class MyViewModel 
{ 
    public string SomeExtraField1 { get; set; } 
    public string SomeExtraField2 { get; set; } 
    public string SomeExtraField3 { get; set; } 

    // this would be for example the concatenation of your domain model 
    // first name and last name as that's what this particular view needs to 
    // display 
    public string PersonFullName { set; set; } 
} 

जहां तक ​​आपके डोमेन मॉडल और दृश्य मॉडलों के बीच रूपांतरण का संबंध है , AutoMapper बस रखा गया है: उत्कृष्ट।

+0

यह निर्माता के माध्यम से देखने के मॉडल के लिए डोमेन वस्तु गुजरती हैं और वह डोमेन वस्तु निजी तौर पर उपयोग करने के लिए ठीक है? – Fixer

+0

@ फ़िक्सर, नहीं, डिफ़ॉल्ट मॉडल बाइंडर उस पर चकित होगा। –

+0

@Darin, ऑटोमैपर – CjCoax

3

मैं एक मैपर परत है कि WCF व्यक्ति वर्ग और "दर्पण" व्यक्ति वर्ग के बीच में बदल सकते हैं बनाने कहेंगे। इस तरह आप अपने एमवीसी कार्यान्वयन को पीओसीओ में जोड़ रहे हैं और सीधे डब्लूसीएफ को नहीं। यदि भविष्य में (looser युग्मन) की आवश्यकता है तो भविष्य में MyViewModel को छूए बिना डब्ल्यूसीएफ को दूसरी सेवा के साथ स्वैप करने की क्षमता को जोड़ता है।