6

几个月来,我一直在开发我的第一个大型(对我而言)MVC 项目,但事情变得非常难以驾驭。

我一直在重构方面有所懈怠,并且正在寻找“最佳实践”的现代示例,以保持您的控制器精简并将所有这些数据移动到您的模型中。

我阅读了这篇详细讨论事情的文章,但没有提供示例项目。

此处发布的大多数“最佳实践”主题倾向于链接到 MVC 音乐商店或 Nerd Dinner 项目,但同时评论倾向于说它们更像是“初学者指南”,而不是“最佳实践”的示例。

有谁知道任何展示正确开发结构的最新开源 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;
        }
    }
}
4

3 回答 3

6

您基本上要寻找的是分层架构。例如,服务层模式要求您在服务层而不是控制器中定义大量逻辑。

有这方面的例子,其中之一是来自微软模式和实践团队的 Silk:http: //silk.codeplex.com/

于 2012-05-27T20:48:12.507 回答
3

当您说您的控制器“冗长且充满代码”时,这是否意味着您的所有代码都在控制器中?如果是这种情况,您需要将大部分逻辑分解为支持 ViewModel 类。

我通常将大部分(如果不是全部)代码放在 ViewModel 类中,每个 View/Controller 一个。所有逻辑都从 ViewModel 中浮现出来,因此每个 Controller 操作都运行一行,可能是两行代码(在合理范围内)。

更新:
我会从您的 Action 中取出所有逻辑并将其移动到一个 ViewModel 方法中,该方法采用一个 int 作为 ID。现在您的控制器操作方法是一行:

return View(MyViewModel.AttendanceView(id));

这是一个简单的例子,还有更高级的想法。

于 2012-05-27T20:50:55.143 回答
2

有谁知道任何展示正确开发结构的最新开源 MVC 项目?

很不幸的是,不行。到目前为止我看到的所有项目都不太适合初学者开始学习。不是因为它们包含糟糕的代码,而是因为它们的复杂性。

我想学习解决的一个典型问题:我的控制器很长,并且充满了驱动网站的代码 - 我需要将此代码移到仅由控制器引用的方法中。我在哪里扔所有这些方法?

如果您的控制器包含许多行,那么您做错了。您需要了解关注点分离以及如何编写干净的代码(以及它的含义)。例如,永远不要编写代码来从控制器中的数据库中检索某些内容。这样的动作属于数据库访问层,逻辑上进一步分为多个类。了解诸如“不要重复自己”等原则。

关于如何编写好的代码有很多讨论,我不确定是否可以在这里完成。有整本书都在讨论这个问题,但我希望我至少能给你一些有用的指导。

于 2012-05-27T23:25:07.837 回答