2011-09-19 15 views
8

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

उदाहरण के लिए, अगर मैं निम्नलिखित मॉडल था:

public FooBarViewModel 
{ 
    public int FooBarId { get; set; } 
    public string SomeInitialProperty1 { get; set; } 
    public string SomeInitialProperty2 { get; set; } 
    public string SomeInitialProperty3 { get; set; } 
    public string SomeInitialProperty4 { get; set; } 
    public int FooId { get; set; } 
    public int BarId { get; set; } 
    public IEnumerable<Foo> Foos { get; set; } 
    public IEnumerable<Bar> Bars { get; set; } 
} 

और फिर नियंत्रक:

public MyController : Controller 
{ 
    [HttpGet] 
    public ActionResult FooBar(int foobarId) 
    { 
     var foobar = _fooBarRepository.GetById(foobarId); 
     var model = new FooBarViewModel 
         { 
          FooBarId = foobar.Id; 
          SomeInitialProperty1 = foobar.SomeInitialProperty1; 
          SomeInitialProperty2 = foobar.SomeInitialProperty2; 
          SomeInitialProperty3 = foobar.SomeInitialProperty3; 
          SomeInitialProperty4 = foobar.SomeInitialProperty4; 
          Foos = foobar.Foos.ToList(); 
          Bars = foobar.Bars.ToList(); 
         } 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult FooBar(FooBarViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      //process model 
      return RedirectToAction("Index"); 
     } 

     var foobar = _fooBarRepository.GetById(model.FoobarId); 
     model.Foos = foobar.GetFoos.ToList(); 
     model.Bars = foobar.GetBars.ToList(); 
     return View(model); 
    } 
} 

या मैं अपने मॉडल में यह करना चाहिए: तो

public FooBarViewModel 
{ 
    public int FooBarId { get; set; } 
    public string SomeInitialProperty1 { get; set; } 
    public string SomeInitialProperty2 { get; set; } 
    public string SomeInitialProperty3 { get; set; } 
    public string SomeInitialProperty4 { get; set; } 
    public int FooId { get; set; } 
    public int BarId { get; set; } 

    public IEnumerable<Foo> Foos 
    { 
     get { return _foos; } 
    } 
    private IEnumerable<Foo> _foos; 

    public IEnumerable<Bar> Bars 
    { 
     get { return _bars; } 
    } 
    private IEnumerable<Bar> _bars; 

    public MyViewModel(FooBar foobar) 
    { 
     FooBarId = foobar.Id; 
     SomeInitialProperty1 = foobar.SomeInitialProperty1; 
     SomeInitialProperty2 = foobar.SomeInitialProperty2; 
     SomeInitialProperty3 = foobar.SomeInitialProperty3; 
     SomeInitialProperty4 = foobar.SomeInitialProperty4; 
     _foos = foobar.Foos.ToList(); 
     _bars = foobar.Bars.ToList(); 
    } 
} 

मेरा नियंत्रक:

public MyController : Controller 
{ 
    [HttpGet] 
    public ActionResult FooBar(int foobarId) 
    { 
     var foobar = _fooBarRepository.GetById(foobarId); 
     var model = new FooBarViewModel(foobar); 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult FooBar(FooBarViewModelmodel) 
    { 
     if (ModelState.IsValid) 
     { 
      //process model 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 
} 

एमवीसी में पसंदीदा परंपरा कौन सा है और यह सबसे अच्छा अभ्यास क्यों है? इसके अलावा, दूसरे पर एक का चयन क्यों करें? अग्रिम में धन्यवाद।

उत्तर

4

डिफ़ॉल्ट रूप से, मुझे विश्वास नहीं है कि एमवीसी निर्भरता रीसोलवर का उपयोग पोस्टबैक पर आपके दृश्य मॉडल का उदाहरण बनाने के लिए करेगा। इस प्रकार, यह केवल पैरामीटर रहित कन्स्ट्रक्टर के साथ एक मॉडल बनाएगा। इससे कन्स्ट्रक्टर में ऑब्जेक्ट को प्रारंभ करना कम आसान हो जाता है।

आप कस्टम मॉडल बाइंडर बना सकते हैं जिसने निर्भरता रेसोलवर के माध्यम से ऑब्जेक्ट बनाया है, लेकिन फिर आप सामान्य अभ्यास से विचलित हो रहे हैं।

मैं अपने दृश्य मॉडल को ऑटोमैपर के साथ इनलाइन करना पसंद करता हूं। ऑटोमैपर के लिए

+0

+1। यहां कुछ नया सीख लिया। –

+0

यह एक अच्छा समाधान की तरह दिखता है और ऐसा लगता है कि यह समय बचाएगा। मैं अपनी परियोजना में इसे लागू करने पर एक नज़र डालने जा रहा हूं। धन्यवाद। – shuniar

4

आम तौर पर आप भारी मॉडल और प्रकाश नियंत्रक चाहते हैं, तो आप अपने नियंत्रक में जितना संभव हो उतना कम करें।

सामान्य डिजाइन पैटर्न कारणों को आपको व्यू मॉडल में व्यूमोडेल प्रारंभ करना चाहिए?

  • सूखी - अगर आप एक से अधिक कार्रवाई ViewModel प्रारंभ करने में है जो है तो आप उस कोड को दोहरा सूख रहे हैं, या आप नियंत्रक में एक निजी विधि में यह डाल रहे हैं। मेरे लिए, यदि आपको नियंत्रक में एक निजी विधि डालना है तो यह एक काफी मजबूत संकेत है कि कोड नियंत्रक में बिल्कुल संबंधित नहीं है।
  • सामंजस्य - सामान्य तौर पर, एक फू वस्तु, किसी अन्य वस्तु से एक फू वस्तु का दृष्टांत के लिए कैसे पता होना चाहिए क्योंकि यह अपने आप के बारे में जानते हुए भी के लिए जिम्मेदारी है। उस तर्क को कहीं और रखकर एकजुटता कम हो जाती है और युग्मन शुरू होता है।
3

मैं हमेशा, 2 दृष्टिकोण लेकिन एक "पैरामीटर के रूप में सभी गुण" के साथ -contructor बजाय निर्माता के लिए "foobar" डालने (MVVM पैटर्न के उल्लंघन के एक तरह से उपयोग कर रहा हूँ के रूप में ViewModel स्वतंत्र रहना चाहिए)।

मेरे लिए यह सबसे अच्छा अभ्यास है क्योंकि आप व्यूमोडेल में अतिरिक्त तर्क छिपा सकते हैं और आपके पास विभिन्न रचनाकारों का उपयोग करके अलग-अलग व्यवहार बनाने की संभावना है।

3

मुझे लगता है कि आपने दूसरे मामले में अच्छा काम किया है। मेरी राय में, उपयोग के लिए तैयार वस्तु प्राप्त करना उस वस्तु की ज़िम्मेदारी है।

क्या होगा यदि आपको उस वर्ग के किसी और उदाहरण की आवश्यकता है? जहां भी आपने इसे बनाया था, वहां से प्रारंभिक कोड को कॉपी करना होगा।