加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – .NET MVC保持控制器不可读的最佳实践

发布时间:2020-12-15 04:27:47 所属栏目:百科 来源:网络整理
导读:我已经开发了我的第一个大型(对我来说)MVC项目,现在已经有几个月了,事情变得非常难以导航. 我一直在摒弃重构,并且正在寻求“最佳实践”的现代示例,只要保持控制器的精简并将所有数据移动到模型中. 我阅读了this article详细讨论了一些内容,但未提供示例项目.
我已经开发了我的第一个大型(对我来说)MVC项目,现在已经有几个月了,事情变得非常难以导航.

我一直在摒弃重构,并且正在寻求“最佳实践”的现代示例,只要保持控制器的精简并将所有数据移动到模型中.

我阅读了this article详细讨论了一些内容,但未提供示例项目.

这里发布的大多数“最佳实践”主题都倾向于链接到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;
        }
    }
}

解决方法

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

有这样的例子,其中一个是来自Pattern&的丝绸. Microsoft的实践团队:http://silk.codeplex.com/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读