1

私が取り組んでいるプロジェクトは「大学管理システム」で、これは大きなプロジェクトです。現在、問題なく機能する学生登録セクションを実装しています (プロジェクトのごく一部)。ASP.NET MVC テンプレートで「Three-Tier Architecture」「ORM - EF」を使用しました。プロジェクトでは、学年、学部などに応じて学生を登録するための検証を行う必要があります。そのため、DAL、BLL、最後にコントローラー、ビューなどのセクションがあります。コントローラーで検証を行い、BLL からデータを取得して、DAL からデータを再度取得しました (これは、「3 層アーキテクチャ」の単純な条件です)。だから私の質問は:

1) コントローラーで検証を行っても問題ありませんか?

2) そうではなく、BLL でそれを行う必要がある場合、それは問題ないのでしょうか? なぜ、またはコントローラーでそれを続けることができますか?

注:私には、コントローラーまたは BLL で検証を行うことは問題ないように思えます。効果はありますか?

今、私は次のことをしました:

ダル:

public List<Student> Add(int studentID, string studentName, string email, DateTime regDate)
{
     List<Student> lst = null;
     Student aStudent = new Student();

     aStudent.StudentID = studentID;
     aStudent.StudentName = studentName;
     aStudent.Email = email;
     aStudent.RegDate = regDate;

     try
     {
        db.Students.Add(aStudent);
        db.SaveChanges();
     }

     catch (Exception ex)
     {
        ex.ToString();
     }

    return lst;
 }

BLL:

public List<Student> Add(int studentID, string studentName, string email, DateTime regDate)
{
   return aStudentGateway.Add(studentID, studentName, email, regDate);
}

コントローラ:

/**Student Registration - Starts**/
[HttpPost]
public ActionResult AddStudent(Student aStudent)
{
    List<Department> departments = aDepartmentManager.GetAllDepartments();
    List<DepartmentViewModel> departmentsViewModel = aDepartmentManager.GetAllDepartmentViewModel();

    DateTime yearInDateTime = Convert.ToDateTime(Request.Form["RegDate"]);
    string extractYear = yearInDateTime.ToString();
    var year = DateTime.Parse(extractYear).Year;
    int department = Convert.ToInt32(Request.Form["Department"]);

    List<Student> studentList = aStudentManager.GetAllStudents();

    int count = 1;

    var query = (from c in studentList
                 where c.Department == department && c.Year == year
                 select c).ToList();

    foreach (var c in query)
    {
        if (query.Count() > 0)
        {
            int m = Convert.ToInt32(c.StudentID);
            count = m + 1; //Incrementing the numbers by one with the table column
        }
        else
        {
            int m = 1;
            count = m + 1; //Incrementing the numbers by one with the variable assigned one
        }
    }

    Student student = new Student();
    student.StudentName = Request.Form["StudentName"];
    student.Email = Request.Form["Email"];
    student.RegDate = Convert.ToDateTime(Request.Form["RegDate"]);
    student.StudentID = count;

    if (aStudentManager.ExistEmailAny(student.Email))
    {
        ViewBag.ErrorMessage = "Email already exists";
    }
    else
    {
        aStudentManager.Add(aStudent.StudentID, aStudent.StudentName, aStudent.Email, aStudent.RegDate);
        ViewBag.Message = "Registration successful. See below to verify.";

        /**This section used to show student details after registration**/
        var result = (from c in departments
                      join d in departmentsViewModel on c.DepartmentID equals d.DepartmentId
                      where d.DepartmentId == department
                      select c);

        foreach (var items in result)
        {
            if (count.ToString().Length > 1)
            {
                ViewBag.StudentID = items.Code + "-" + year + "-" + "0" + count;
            }
            else
            {
                ViewBag.StudentID = items.Code + "-" + year + "-" + "00" + count;
            }

            StudentViewModel.StudentID = student.StudentID;
            StudentViewModel.StudentName = student.StudentName;
            StudentViewModel.Email = student.Email;
            StudentViewModel.RegDate = student.RegDate;
        }
        /**This section used to show student details after registration**/
    }

    return View();
}
/**Student Registration - Ends**/
4

2 に答える 2

1

1) コントローラーで検証を行っても問題ありませんか?

Data Annotation Validator Attributesいいえ、 を使用し、モデル クラスで検証を行う方がよいでしょう。

第二に、コントローラーで DAL のいくつかのことを行っています。

List<Department> departments = aDepartmentManager.GetAllDepartments();
List<DepartmentViewModel> departmentsViewModel = aDepartmentManager.GetAllDepartmentViewModel();

var query = (from c in studentList
             where c.Department == department && c.Year == year
             select c).ToList();

これらのすべてのクエリは DAL 内にある必要があります。これは DAL を正確に使用してデータベースと対話し、コントローラーをクリーンに保ちます。

第三に、

コントローラーに渡す場合Student、 を使用して各属性を取得する必要はありませんRequest.Form

これが理にかなっていることを願っています!

于 2016-11-16T07:31:49.187 に答える
1

レイヤーのコンテキストと意味に応じて、さまざまなレイヤーで複数の検証ステップを提供します。

まず、クライアント側とサーバー側の両方で検証を提供することがベスト プラクティスです。

クライアント側では、必須フィールドのフィールド チェックとその他の簡単な検証を提供する必要があります。MVCを使用している場合は、データ注釈を使用できます

同じ検証をコントローラーで複製する必要があります。ここでは、渡されたパラメーターにある種のコントラクトを適用するのに失敗するはずです。1 つの良い方法は、コード コントラクトを使用して、実行のパイプラインを続行するために満たす必要がある前提条件を提供することです。

ビジネス レイヤーでは、ビジネス ロジックで実行する必要があるチェックを提供します。

最後に、データ アクセス レイヤーで、データを永続化するために必要なすべてのチェックを提供します。EF を使用している場合は、エンティティ クラスにIValidatableObjectを実装することをお勧めします。ここScott Gu のブログで、この手法を説明する投稿を見つけることができます。

このアプローチは繰り返しを導入するように見えますが、データに一貫性をもたらし、レイヤー間で関心を分離します。

于 2016-11-16T07:35:37.153 に答える