【问题标题】:MVC Entity separation best practise [closed]MVC 实体分离最佳实践 [关闭]
【发布时间】:2016-10-12 14:11:46
【问题描述】:

这是一个假设性问题,假设我有一个非常基本的论坛

我有以下实体(对象)

public class User 
{
    public Guid Id { get; set;}
    public string Username { get; set;}
}

public class Thread
{
    public Guid Id { get; set;}
    public Guid Owner { get; set;}//UserId
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
}

public class Post
{
    public Guid Id { get; set; }
    public Guid ThreadId { get; set; }
    public string Content { get; set; }
    public DateTime DatePosted { get; set; }
    public Guid PostedBy { get; set; }//UserId
}

我有以下控制器

  1. 用户控制器
  2. 线程控制器
  3. PostsController

当我想检索特定线程或线程列表时,我点击了 ThreadsController。

当我想检索特定线程的帖子时,我点击 PostsController

问题:

如果我想检索用户创建的线程列表,以下哪个是最好的方法:

  1. 新建一个控制器——UserThreadsController,返回一个Thread对象列表

  2. 在 ThreadsController 上创建一个额外的操作方法,即 GetByUser

  3. 在 UserController 上创建一个额外的操作方法,即 GetThreads

谢谢

【问题讨论】:

  • 你能发布你的模型吗? Threads 是否有链接到User 表的ID 字段的外键属性?
  • 问题不在于我如何检索数据,我对此非常满意。问题是如何构建我的控制器?

标签: c# asp.net-mvc asp.net-mvc-controller


【解决方案1】:

这很可能会因固执己见而被关闭,因为,嗯,确实如此。我个人的看法是,你们已经分得太多了。

实体和控制器之间不必存在 1-1 的关联。事实上,通常最好让控制器保持更高级别,封装概念,而不仅仅是一件事。例如,您可能只有一个ForumController,其中包含列出所有线程和显示单个线程的操作。至少在我遇到的每个论坛中,单个帖子永远不会单独显示,因此您甚至不需要对这些帖子进行操作。

显示特定于用户的线程有点麻烦。在UserController 上有这样的东西是有意义的,但在ForumController 中拥有所有与论坛相关的东西也很有意义。我认为你可以合理地选择任何一种方式。

【讨论】:

  • 感谢您的意见,克里斯。非常感激。它确实与我收到的其他一些建议(或者更确切地说是另一种意见)相矛盾,即有很多控制器很少有动作,而不是少数控制器有很多动作。如果它是 REST 服务而不是 ASP.Net MVC 应用程序,您会给出相同的意见吗?再次感谢
  • 视情况而定。在 MVC 中,模式,俗话说“瘦控制器,胖模型”。然而,在 MVC 框架中,没有真正的模型,并且控制器往往需要比在更严格遵守 MVC 模式的框架中做更多的繁重工作。我不一定提倡使用数千行代码的控制器,但我们在这里真的不是在谈论这个。即使是一个完整的基本论坛也可能只包含 6-8 个动作,您可以将这些动作的大部分真实代码分解到实用程序类中。
  • 有趣。这是有道理的,因为我的大多数控制器操作都是包裹在 try catch 中的一个衬垫(一个衬垫去服务以处理繁重的工作)。我保证的最后一个问题 - 所以要遵​​循典型的 REST 约定(GET/POST/PUT/DELETE),你会说相反的情况是正确的吗?我知道 WebApi 和 Asp.Net MVC 在架构 (MVC) 上是相似的,但它现在让我失望了。再次感谢您的意见
  • Web Api 有点不同,因为您要为 REST API 设置一个非常具体的结构。但是,相关对象可以在同一个 Web Api 控制器中处理。例如,对于PUT /user/1/address/ 之类的端点,我希望该操作位于UserApiController 之类的位置,而不是AddressApiController
  • 感谢您解决这个问题。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2010-10-06
  • 2011-10-28
相关资源
最近更新 更多