2012-03-27 4 views
7

को डिज़ाइन करने के लिए कैसे करें I प्रोजेक्ट में ईएफ 4 लागू किया गया है। इसके भीतर, टेबल ग्राहक और ऑर्डर हैं। जिसके संबंध में एक (ग्राहक) कई (आदेश) है।व्यूमोडेल

मैं अपने डोमेन परत से इंटरफ़ेस परत (इस मामले में एमवीसी) से पारित होने के लिए दोनों (ग्राहक दृश्य मॉड्यूल और ऑर्डर व्यू मॉडेल) के लिए एक व्यूमोडेल बना रहा हूं।

अब सवाल "है मैं दोनों viewmodel संदर्भित करने के लिए? Customerviewmodel में उदाहरण के लिए IEnumerable<OrderViewModel> है और orderviewmodel में CustomerViewModel है की जरूरत है। यदि ऐसा है तो मैं इसे कैसे डिजाइन करते हैं (एक सबसे अच्छा अभ्यास के रूप में) ताकि IEnumerable<OrderViewModel> और CustomerViewModel भरा हुआ है सही संदर्भ?

+0

देखें कि यह मदद करता है: http://blogs.teamb.com/craigstuntz/2009/12/31/38500/ –

+0

क्षमा करें प्रासंगिक नहीं .. – user384080

उत्तर

23

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

नतीजतन आपके पासनहीं हैऔर CustomerViewModel क्योंकि आपके पास अलग-अलग विचार हैं जो ऑर्डर या ग्राहक या इनमें से कुछ हिस्सों को प्रदर्शित या संपादित करेंगे। इसलिए, आपके पास उन व्यूमोडल्स को एक विशिष्ट उद्देश्य और देखने के लिए है और इसलिए विभिन्न भिन्नताओं में कई बार।

मान लीजिए, आपके पास OrderEditView है और यह दृश्य ऑर्डर जानकारी संपादित करने और उस ऑर्डर के ग्राहक को प्रदर्शित करने की अनुमति देगा। आप एक OrderEditViewModel इस तरह होगा:

public class OrderEditViewModel 
{ 
    public int OrderId { get; set; } 

    public DateTime? ShippingDate { get; set; } 

    [StringLength(500)] 
    public string Remark { get; set; } 
    //... 

    public OrderEditCustomerViewModel Customer { get; set; } 
} 

public class OrderEditCustomerViewModel 
{ 
    [ReadOnly(true)] 
    public string Name { get; set; } 

    [ReadOnly(true)] 
    public string City { get; set; } 
    // ... 
} 

यह OrderEditCustomerViewModelOrderEditViewModel के लिए एक संदर्भ की जरूरत नहीं है।

तुम इतनी तरह इस ViewModel पॉप्युलेट कर सकते हैं: यदि आप एक CustomerEditView जो संपादन ग्राहक जानकारी की अनुमति देता है और किसी सूची में ग्राहक के आदेश प्रदर्शित होती है

var orderEditViewModel = context.Orders 
    .Where(o => o.OrderId == 5) 
    .Select(o => new OrderEditViewModel 
    { 
     OrderId = o.OrderId, 
     ShippingDate = o.ShippingDate, 
     Remark = o.Remark, 
     Customer = new OrderEditCustomerViewModel 
     { 
      Name = o.Customer.Name, 
      City = o.Customer.City 
     } 
    }) 
    .SingleOrDefault(); 

दूसरी ओर,, ViewModel हो सकता है:

public class CustomerEditViewModel 
{ 
    public int CustomerId { get; set; } 

    [Required, StringLength(50)] 
    public string Name { get; set; } 

    [Required, StringLength(50)] 
    public string City { get; set; } 
    //... 

    public IEnumerable<CustomerEditOrderViewModel> Orders { get; set; } 
} 

public class CustomerEditOrderViewModel 
{ 
    [ReadOnly(true)] 
    public DateTime? ShippingDate { get; set; } 

    [ReadOnly(true)] 
    public string Remark { get; set; } 
    // ... 
} 

यहाँ CustomerEditOrderViewModelCustomerEditViewModel के लिए एक संदर्भ की जरूरत नहीं है और आप उदाहरण के लिए इस तरह से डेटाबेस से ViewModel बना सकते हैं:

var customerEditViewModel = context.Customers 
    .Where(c => c.CustomerId == 8) 
    .Select(c => new CustomerEditViewModel 
    { 
     CustomerId = c.CustomerId, 
     Name = c.Name, 
     City = c.City, 
     Orders = c.Orders.Select(o => new CustomerEditOrderViewModel 
     { 
      ShippingDate = o.ShippingDate, 
      Remark = o.Remark 
     }) 
    }) 
    .SingleOrDefault(); 

Customer(*)ViewModel और Order(*)ViewModel रों अलग हैं - आवश्यक संदर्भ, गुणों और डेटा एनोटेशन के बारे में, दृश्य जहां वे इस्तेमाल कर रहे हैं पर निर्भर करता है।

इन विचारों के साथ OrderViewModel और CustomerViewModel के बीच पारस्परिक सही संदर्भों के प्रश्न के साथ प्रश्न गायब हो जाते हैं क्योंकि आपको आमतौर पर अपने विचारों के लिए ऐसे द्विपक्षीय संदर्भ की आवश्यकता नहीं होती है।

+0

स्लुमा .. आप ईएम इकाई को व्यूमोडेल के बीच मैपिंग कैसे करते हैं और इसके विपरीत? – user384080

+0

भी .. आप सार्वजनिक IENumerable <ग्राहकEditOrderViewModel> ऑर्डर {प्राप्त करें; सेट; } ग्राहकEditViewModel में? क्या आप आलसी या उत्सुक हैं? – user384080

+0

@ user384080: ईएफ इकाई से व्यू मॉडेल में मैपिंग 'सिलेक्ट' (इसे "प्रक्षेपण" कहा जाता है और न ही आलसी और न ही लोडिंग के साथ दो कोड स्निपेट हैं, लेकिन उत्सुक लोडिंग के करीब हैं, सिवाय इसके कि आप केवल डीबी से कॉलम पुनर्प्राप्त करते हैं, वास्तव में ViewModel के लिए जरूरी है, पूर्ण इकाई नहीं जो अनावश्यक ओवरहेड होगी)। खासकर आखिरी स्निपेट 'ऑर्डर' संग्रह को भी पॉप्युलेट करता है (आंतरिक 'चयन' देखें)। व्यूमोडेल से इकाई तक वापस आने के लिए मैं डीटीओ का उपयोग करता हूं, आप मैन्युअल रूप से व्यूमोडेल से डीटीओ तक गुणों को मैप कर सकते हैं या ऑटोमैपर जैसे टूल का उपयोग कर सकते हैं। – Slauma