几个月来,我一直在开发我的第一个大型(对我来说)mvc项目,现在事情变得非常难以控制。
我一直在懒散地进行重构,并在寻找“最佳实践”的现代示例,以保持控制器的精简并将所有这些数据移动到模型中。
我读过详细讨论事情的this article,但没有提供一个示例项目。
这里发布的大多数“最佳实践”主题倾向于链接到MVC音乐商店或书呆子晚餐项目,但同时评论倾向于说它们更多的是“初学者指南”,而不是“最佳实践”的示例。
有没有人知道任何最新的开源mvc项目展示了正确的开发结构?
注意:我想学习解决的一个典型问题是:我的控制器非常长,并且充满了驱动网站的代码——我需要将这些代码转移到只由控制器引用的方法中。我该把这些方法都扔到哪里去?
下面是一个来自控制器的代码示例,这是对其中一个回复的评论所建议的。如何将这些信息移到viewmodel上?(我已经包含了下面的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);
}

视图模型:
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;
        }
    }
}

最佳答案

你要找的基本上是一个分层的架构。例如,服务层模式要求您在服务层而不是控制器中定义大量逻辑。
有这样的例子,其中一个来自微软模式与实践团队:http://silk.codeplex.com/

08-07 15:24