2012-05-27 15 views
6

Rozwijam swój pierwszy duży (dla mnie) projekt MVC od kilku miesięcy i rzeczy stają się niezwykle trudne w nawigacji..NET MVC Najlepsze praktyki, jeśli chodzi o utrzymanie kontrolera z bardzo nieczytelnego

Zwalczam refaktoryzację i szukam współczesnych przykładów "najlepszych praktyk", jeśli chodzi o utrzymanie cienkiego kontrolera i przenoszenie wszystkich tych danych do modeli.

Czytam this article, który omawia szczegółowo szczegóły, ale nie zapewnia przykładowego projektu.

Wątki "najlepszych praktyk" zamieszczane tutaj mają tendencję do linkowania do sklepu muzycznego MVC lub projektu Nerd Dinner, ale w tym samym czasie komentarze raczej mówią, że są raczej "przewodnikami dla początkujących", a nie przykładami "najlepszych praktyk". "

Czy ktoś wie o wszelkich aktualnych projektach MVC o otwartym kodzie źródłowym, które wykazują właściwą strukturę rozwoju?

uwaga: Typowy problem, który chciałbym nauczyć się rozwiązywać: Moje kontrolery są bardzo długie i pełne kodu, który napędza witrynę - muszę przenieść ten kod do metod, które są jedynie przywoływane przez kontroler . Gdzie mogę rzucić wszystkie te metody?

Oto próbka mojego kodu z kontrolera, jak sugeruje komentarz do jednej z odpowiedzi. W jaki sposób przenieść niektóre z tych informacji do mojego ViewModel? (Mam włączone poniższy ViewModel):

Kontroler:

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; 
     } 
    } 
} 

Odpowiedz

6

Co jesteś w zasadzie patrząc na to warstwowa architektura. Na przykład wzorzec Warstwy usług wymaga zdefiniowania dużej logiki w warstwie usługi, a nie w kontrolerach.

Istnieją przykłady tego, jeden z nich jest jedwab z wzorca zespołu & Praktyki w firmie Microsoft: http://silk.codeplex.com/

+0

Sprawdzam kod i znalazłem wiele błędów. Na przykład klasa handlers.GetFillupsForVehicle, najpierw jego przeskok (definiująca klasę jako czasownik) i druga jedyna funkcja, która robi coś użytecznego w klasie, zwraca wartość IEnumerable, gdzie wyraźnie kod funkcji zwraca tylko listę, więc jej wymuszając dwuznaczność tam, gdzie jej nie ma. – magallanes

3

Kiedy mówisz kontrolery są „długie i pełne kodu,” Czy to oznacza cały kod jest w kontrolerze? W takim przypadku musisz przełamać większość logiki w celu wspierania klas ViewModel.

Zwykle umieszczam większość (jeśli nie wszystkie) mojego kodu w klasach ViewModel, po jednym na widok/kontroler. Wszystko logika jest powierzchniowe z ViewModel, tak, że każda akcja Controller działa jeden, może dwa wiersze kodu

UPDATE (w granicach rozsądku).:
wziąłbym wszystkie logiki ze swojego działania i przenieść go do metoda ViewModel, która przyjmuje int dla identyfikatora. Teraz metoda działania kontrolera to jedna linia:

return View(MyViewModel.AttendanceView(id)); 

Jest to uproszczony przykład, istnieją bardziej zaawansowane pomysły.

2

Czy ktoś wie o wszelkich aktualnych projektach MVC o otwartym kodzie źródłowym, które demonstrują właściwą strukturę rozwoju?

Niestety nie. Wszystkie projekty, które do tej pory widziałem, nie nadają się dla początkujących na rozpoczęcie nauki. Nie dlatego, że zawierają słaby kod, ale z powodu jego złożoności.

Typowym problemem, który chciałbym nauczyć się rozwiązać: Moi kontrolery są bardzo długie i pełne kodu, który napędza stronę - muszę przejść ten kod się do metod, które są jedynie przywoływanych przez kontroler. Gdzie mogę rzucić wszystkie te metody?

Jeśli kontrolery zawierają wiele wierszy, robisz to źle. Musisz dowiedzieć się, jak rozdzielić wątpliwości i jak napisać czysty kod (i co to znaczy). Na przykład nigdy nie pisz kodu, aby pobrać coś z bazy danych w kontrolerze. Takie działanie należy do warstwy dostępu do bazy danych, logicznie podzielonej na wiele klas. Poznaj zasady "Nie powtarzaj się" itp.

Jest wiele do omówienia, jak napisać dobry kod i nie jestem pewien, czy można to zrobić tutaj. Są całe książki omawiające tę sprawę, ale mam nadzieję, że dałem wam przynajmniej kilka przydatnych wskazówek na początek.