MVC 4控制器和Web Api控制器

时间:2014-04-17 14:02:03

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

我目前正在开发一个MVC 4项目,我需要将数据库的访问权限提供给移动应用程序,因此我选择在Web Api中实现我的Web服务以获得Json resulat。 问题是我有很多代码冗余! MVC控制器和Web Api控制器中存在相同的代码。

例如,获取程序:

1- web api controller:

 public User GetUser(int id)
    {
        User user = db.Users.Find(id);
        if (user == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return user;
    }

2-MVC控制器

 public ActionResult Details(int id = 0)
    {
        User user = db.Users.Find(id);
        if (user == null)
        {
            return HttpNotFound();
        }
        return View(user);
    }

一个是在JSon中返回User实体,另一个返回一个视图! 那么如何在另一个控制器中使用一个控制器来摆脱重新发生?

3 个答案:

答案 0 :(得分:1)

从关注点分离的角度来看这个问题,两个控制器都有不同的功能(分别提供JSON和标记),但两者都需要使用公共服务:即数据持久性。 / p>

因此,正如@paul在评论中所建议的那样,存储库模式提供了一个很好的设计来解决这个问题。在您的示例中,您似乎没有获得太多收益,但只要您的数据检索和持久性逻辑变得更加复杂,存储库就会强制执行一致性,减少冗余并支持更复杂的模式,例如依赖注入。

这是一个简单的存储库:

interface IRepository
{
    User GetUser(int id);
}

public class MyRepository: IRepository
{
    public User GetUser(int id)
    {
        return db.Users.Find(id);
    }
}

Api控制器

public User GetUser(int id)
{
    var repo = new MyRepository();
    User user = repo.GetUser(id);
    if (user == null)
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
    }
    return user;
}

MVC控制器:

public ActionResult Details(int id = 0)
{
    var repo = new MyRepository();
    User user = repo.GetUser(id);
    if (user == null)
    {
        return HttpNotFound();
    }
    return View(user);
}

答案 1 :(得分:1)

保罗说这完全是关于分离问题。 Paul为您提供了一个“逻辑服务层”的示例,该逻辑服务层是您的解决方案中的独立类库,您的其他Web应用程序或桌面应用程序等引用它。另一个示例可能是“物理服务层”,它是解决方案中的另一个Web Api项目,它包含应用程序的所有服务方法。从您的MVC项目中,只要您想要呼叫您的用户,您就可以创建一个新的WebClient来调用您的web api的GetUser端点。

答案 2 :(得分:1)

您可以从MVC控制器返回JSON()并避免使用两个框架。这没有什么不妥,会让你的生活变得简单。

public ActionResult GetUser(int id) // GetUser is the action name, or you can just use Index
{
    User user = db.Users.Find(id);
    if (user == null)
    {
        return HttpNotFound();
    }

    return Json(user);
}