2012-05-27 16 views
6

मैं अब कुछ महीनों के लिए मेरी पहली बड़ी (मेरे लिए) MVC परियोजना का विकास किया गया है और चीजों को नेविगेट करने के लिए बेहद मुश्किल हो रही है किया जा रहा से नियंत्रक रखने के रूप में।नेट MVC सर्वश्रेष्ठ अभ्यास बहुत अपठनीय

मैं रिफैक्टरिंग पर बंद slacking किया गया है और के आधुनिक उदाहरण की मांग कर रहा हूँ 'सर्वोत्तम प्रथाएं' जहाँ तक अपने नियंत्रक पतली रखने और अपने मॉडल के लिए कि डेटा के सभी जाने के रूप में।

मैं this article कि विस्तार से बातें की चर्चा है, लेकिन एक उदाहरण परियोजना प्रदान नहीं करता है पढ़ें।

अधिकांश 'सर्वोत्तम प्रथाएं' धागे यहां पोस्ट MVC संगीत स्टोर या बेवकूफ डिनर परियोजना से जोड़ने के लिए जाते हैं, लेकिन एक ही समय में टिप्पणियां कहने के लिए वे और अधिक 'शुरुआत की गाइड' के बजाय 'सर्वोत्तम प्रथाओं के उदाहरण हैं करते हैं। '

किसी को भी किसी भी अप-टू-डेट खुला स्रोत MVC परियोजनाओं है कि समुचित विकास संरचना प्रदर्शित की पता है?

ध्यान दें: एक ठेठ समस्या यह है कि मैं हल करने में जानना चाहते हैं: मेरी नियंत्रकों बहुत लंबा और कोड से भरा है कि वेबसाइट ड्राइव कर रहे हैं - मैं इस कोड तरीकों कि केवल नियंत्रक द्वारा संदर्भित कर रहे हैं में बंद बढ़ने की जरूरत है । मैं इन सभी तरीकों को कहां फेंक दूं?

यहाँ एक एक नियंत्रक से मेरे कोड का एक नमूना के रूप में प्राप्त उत्तरों में से एक पर एक टिप्पणी ने सुझाव दिया है। मैं इस जानकारी में से कुछ को अपने व्यूमोडेल पर कैसे ले जाऊं? (मैं नीचे ViewModel को शामिल किया है):

नियंत्रक:

public ActionResult AttendanceView(int id) 
{ 
    // 
    // Generates list of Attendances specifically for current Course 
    var attendanceItems = db.Attendance.Where(s => s.CourseID == id); 
    List<Attendance> attendanceItemsList = attendanceItems.ToList(); 
    // End of generating list of Attendances 

    // 
    // Generates list of Students in alphabetical order sorted by LastName 
    var student = attendanceItemsList.Select(a => a.Student).Distinct().OrderBy(s => s.LastName); 
    List<Student> StudentList = student.ToList(); 
    // End of generating list of Students 


    // 
    // Generates list of AttendingDays specifically for current Course 
    Course course = db.Courses.FirstOrDefault(p => p.CourseID == id); 
    List<int> attDayList = new List<int>(); 
    for (int i = 0; i < course.AttendingDays; i++) 
    { 
     attDayList.Add(i + 1); 
    }; 
    // End of generating list of AttendingDays 

    AttendanceReportViewModel model = new AttendanceReportViewModel 
    { 
     AttendanceDays = attDayList, 
     Students = StudentList, 
     Attendances = attendanceItemsList, 
     courseId = id 
    }; 
    return View(model); 
} 

ViewModel:

namespace MyApp.ViewModels 
{ 
    public class AttendanceReportViewModel 
    { 
     public List<int> AttendanceDays { get; set; } 

     public List<Student> Students { get; set; } 

     public List<Attendance> Attendances { get; set; } 

     public int courseId { get; set; } 

     public string IsPresent(Student student, int attendanceDay) 
     { 
      return Attendances.Single(a => a.StudentID == student.StudentID && a.AttendanceDay == attendanceDay).Present ? MyAppResource.Present_Text : MyAppResource.Absent_Text; 
     } 
    } 
} 

उत्तर

6

क्या आप मूल रूप से की तलाश कर रहे एक स्तरित वास्तुकला है। उदाहरण के लिए सर्विस लेयर पैटर्न के लिए आपको अपने नियंत्रकों की बजाय सेवा परत में बहुत से तर्क को परिभाषित करने की आवश्यकता होती है।

इसके उदाहरण हैं, उन्हें पैटर्न माइक्रोसॉफ्ट पर & आचरण टीम की ओर से किया जा रहा है सिल्क में से एक: http://silk.codeplex.com/

+0

मैं कोड की जांच कर रहा हूं और मुझे कई गलतियां मिलीं। उदाहरण के लिए क्लास हैंडलर। गेटफिल्प्स फॉरवहिकल, पहले इसकी ओवरकिल (कक्षा को क्रिया के रूप में परिभाषित करना) और दूसरा एकमात्र फ़ंक्शन जो क्लास में कुछ उपयोगी करता है, एक आईनेमरेबल देता है, जहां स्पष्ट रूप से फ़ंक्शन का कोड केवल एक सूची देता है, इसलिए इसकी एक अस्पष्टता को मजबूर करना जहां वहां नहीं है। – magallanes

3

जब आप कहते हैं कि अपने नियंत्रकों हैं "लंबा और कोड से भरा," यह आपके कोड के सभी मतलब है नियंत्रक में है? यदि ऐसा है, तो आपको ViewModel कक्षाओं का समर्थन करने के लिए अधिकांश तर्कों को तोड़ने की आवश्यकता है।

मैं आमतौर पर ViewModel कक्षाओं में मेरी कोड, देखें/नियंत्रक प्रति एक के सबसे डाल (यदि सभी नहीं)। सभी तर्क ViewModel से प्रदर्शित किया जाता है, जैसे कि प्रत्येक नियंत्रक कार्रवाई एक, हो सकता है कोड की दो पंक्तियाँ चलाता

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

return View(MyViewModel.AttendanceView(id)); 

यह एक सरल उदाहरण है, वहां और अधिक उन्नत विचार हैं।

2

क्या किसी को भी अद्यतित ओपन-सोर्स एमवीसी परियोजनाओं के बारे में पता है जो उचित विकास संरचना का प्रदर्शन करते हैं?

दुर्भाग्य से नहीं। जिन परियोजनाओं को मैंने अभी तक देखा है, वे शुरुआती लोगों के साथ सीखना शुरू करने के लिए बहुत उपयुक्त नहीं हैं। ऐसा नहीं है क्योंकि उनमें एक खराब कोड है, लेकिन उनकी जटिलता के कारण।

एक सामान्य समस्या जिसे मैं हल करना सीखना चाहता हूं: मेरे नियंत्रक बहुत लंबे और कोड से भरे कोड से भरे हुए हैं - मुझे इस कोड को उन तरीकों से दूर करने की आवश्यकता है जिन्हें केवल नियंत्रक द्वारा संदर्भित किया जाता है। मैं इन सभी तरीकों को कहां फेंक दूं?

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

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

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