在MVC 4中分离关注点和API控制器

时间:2012-12-05 22:35:09

标签: asp.net .net asp.net-mvc-4

我正在尝试构建我的第一个企业 ASP.NET MVC 4 Web应用程序,我在解决正确的事情流程时遇到了一些问题。

假设我有一个Clients.cshtml视图,它有相应的ClientsController,基类Controller

我希望客户端视图显示系统中所有客户端的列表。

由于分离关注,我认为处理此类请求的正确位置是ApiController,而不是Controller本身,我认为应该或多或少地限制在UI任务中。因此,我在getClients()中添加方法ApiController,它将返回包含所有客户端的JSON对象。

现在,如何从我的视图或Controller中使用此功能? 我相信,一种方法是使用javascript处理它;加载视图时,我使用ApiController等来调用jQuery,并以异步方式显示结果。

但我不确定这是正确的做法,是吗?我相信这是一种方法,但我想知道替代方案,或更好(更常规)的方法来处理这个问题。

谢谢

2 个答案:

答案 0 :(得分:2)

如果您不在其他网络应用或移动应用中使用该API,则无需开发Web API。 Web API旨在为多个消费者提供单一核心的简单方法,例如Android应用程序,iOS,Web应用程序甚至是定制的第三方消费者。

因此,如果您的应用不会以这种方式使用,则无需使用API​​控制器。

如果你想分开关注点,我建议你在同一个解决方案中创建一个不同的项目(一个类库项目),该项目将是你的内部API。然后你的MVC项目将使用你的内部API,试图让你的控制器尽可能保持皮肤。我建议你阅读this article(它适用于Ruby on Rails,但所有概念都适用于MVC .NET)。

答案 1 :(得分:0)

您正在寻找的是一种将相同数据显示在您的视图(服务器端呈现)和您的javascript(通过JSON API)的方法。

有很多方法可以解决这个问题。正如您所提到的,您可以创建一个单独的API控制器,但根据我的经验,一旦您超越少数API调用,这有点臭。理想情况下,您希望您的API具有与普通控制器相同的RESTful架构,这意味着您将重复添加,列出和删除对象的许多相同逻辑。

我发现一个很好的选择是允许每个控制器返回一个视图或JSON,具体取决于请求的格式。这可以扩展为包括XML,CSV或您希望从客户端使用的任何其他格式。这个方法有excellent blog post Michael Morton {{3}}。它可能不是您正在寻找的,但最终结果看起来像这样:

public ActionResult Index()
{
    List<Client> clients = db.Clients.ToList();
    return RespondTo(format =>
    {
        format.Html = () => View(clients);
        format.Json = () => Json(clients);
    });
}