6

私は最初の大規模な (私にとって) 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;
        }
    }
}
4

3 に答える 3

6

基本的に探しているのは、階層化されたアーキテクチャです。たとえば、サービス層パターンでは、コントローラーではなくサービス層で多くのロジックを定義する必要があります。

これには例があり、そのうちの 1 つが Microsoft の Pattern & Practices チームの Silk です: http://silk.codeplex.com/

于 2012-05-27T20:48:12.507 に答える
3

コントローラーが「長くてコードでいっぱい」であると言うとき、これはすべてのコードがコントローラーにあるということですか? その場合は、ほとんどのロジックをサポートする ViewModel クラスに分割する必要があります。

私は通常、コードのほとんど (すべてではないにしても) を View/Controller ごとに 1 つ、ViewModel クラスに配置します。すべてのロジックは ViewModel から表示されるため、各 Controller アクションは 1 行、場合によっては 2 行のコードを (妥当な範囲内で) 実行します。

更新:
アクションからすべてのロジックを取り出し、ID に int を取る ViewModel メソッドに移動します。これで、コントローラー アクション メソッドは 1 行になりました。

return View(MyViewModel.AttendanceView(id));

これは単純な例であり、より高度なアイデアがあります。

于 2012-05-27T20:50:55.143 に答える
2

適切な開発構造を示す最新のオープンソース MVC プロジェクトを知っている人はいますか?

残念だけど違う。これまで見てきたすべてのプロジェクトは、初心者が学習を始めるのにはあまり適していません。コードが貧弱だからではなく、複雑だからです。

解決したい典型的な問題: 私のコントローラーは非常に長く、Web サイトを駆動するコードでいっぱいです。このコードを、単にコントローラーによって参照されるメソッドに移動する必要があります。これらすべてのメソッドをどこに投げますか?

コントローラーに多くの行が含まれている場合は、間違っています。関心の分離と、クリーンなコードの書き方 (およびその意味) について学ぶ必要があります。たとえば、コントローラーのデータベースから何かを取得するコードを記述しないでください。このようなアクションはデータベース アクセス層に属し、論理的にさらに複数のクラスに分割されます。「同じことを繰り返さない」などの原則について学びます。

良いコードを書く方法について議論すべきことはたくさんありますが、それがここでできるかどうかはわかりません。この問題について論じている本はたくさんありますが、最初に役立つヒントをいくつか提供できれば幸いです。

于 2012-05-27T23:25:07.837 に答える