私は最初の大規模な (私にとって) MVC プロジェクトを数か月間開発してきましたが、ナビゲートするのが非常に難しくなっています。
私はリファクタリングを怠っていて、コントローラーを薄く保ち、そのすべてのデータをモデルに移動する限り、「ベスト プラクティス」の最新の例を探しています。
詳細について説明しているこの記事を読みましたが、サンプル プロジェクトは提供されていません。
ここに投稿された「ベスト プラクティス」スレッドのほとんどは、MVC Music Store または Nerd Dinner プロジェクトにリンクする傾向がありますが、同時に、コメントは「ベスト プラクティス」の例ではなく「初心者向けガイド」であると言う傾向があります。
適切な開発構造を示す最新のオープンソース MVC プロジェクトを知っている人はいますか?
注: 解決したい典型的な問題: 私のコントローラーは非常に長く、ウェブサイトを駆動するコードでいっぱいです。このコードを、単にコントローラーによって参照されるメソッドに移動する必要があります。これらすべてのメソッドをどこに投げますか?
これは、返信の1つに対するコメントで提案されているコントローラーからの私のコードのサンプルです。この情報の一部を 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;
}
}
}