asp.net mvc 4 web api - 数据完整性/验证责任

时间:2014-06-01 11:21:15

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api2

我是Asp.net MVC和Web API的新手,只是学习它。

我们说

型号:

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
}

public class Course
{
    public int CourseID { get; set; }
    public string CourseName { get; set; }

    public IEnumerable<int> StudentIds { get; set; }
}

控制器:

  1. 用户控制器 - 实现发布,放置,获取,删除
  2. 课程控制器 - 实现发布,投入,获取,删除
  3. 每个控制器使用某种存储库来获取/添加/删除/更新数据
    让我们说:
    课程资料库是 静态字典&lt;'int,课程&gt;课程
    学生资料库是 *静态字典&lt;'int,学生&gt;学生*

    我们不使用实体框架!

    自定义路由

    发布 / api / courses / {courseid} / users / {userid} 这应该转到课程控制器和将用户ID添加到列表

    [Route("api/courses/{CourseID}/students/{StudentID}")]
    [HttpPost]
    public HttpResponseMessage AddStudentToCourse(int CourseID, int StudentID) 
    { 
        // adding student id to the course
        ... 
    }
    

    的问题:

    1. 我应该使用自定义路由添加课程和用户之间的映射
    2. 我应该检查学生是否存在吗?或者这是与客户的协议,输入有效
    3. 如果我们检查 - 谁应该这样做?控制器?该模型 ?某种数据访问层?
    4. 如果它的 CourseController / CourseModel 意味着它应该“知道”两个存储库(课程存储库和学生存储库)吗?

1 个答案:

答案 0 :(得分:0)

我会尝试按顺序回答您的问题,但请记住,这类问题可以通过意见,个人偏好和个人经验来回答,因此您可能会得到不同的答案:

  1. 一般情况下,您应该避免使用属性路由,但如果这是一个异常且适合您的路由模式:请选择它。
  2. 您应该始终确保数据的完整性并以这种方式实现数据访问。如果客户端滥用您的服务,可能会损害您的数据完整性。如果学生存在,给他一个HTTP 200或201,如果学生不存在,给他一个HTTP 400错误(f.e. a 404)。根据经验:不信任您的客户并检查并验证它发送给您的API的数据。
  3. 我会在数据访问层中执行此操作。您应该考虑事物控制器,这意味着您应该避免在控制器中进行大量操作。您的模型只是您数据的表示。它不应包含任何逻辑来确定是否存在特定实体。
  4. 我不知道我的问题是否正确,但应该在第3点回答。
  5. 希望这能回答你的大部分问题。