【问题标题】:MVC 4 Controller and Web Api controllerMVC 4 控制器和 Web Api 控制器
【发布时间】:2014-06-01 20:26:52
【问题描述】:

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

例如get过程:

1- web api 控制器:

 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 实体,另一个返回一个视图! 那么如何在另一个控制器中使用一个控制器来摆脱冗余呢?

【问题讨论】:

  • 真正的问题应该是,您是直接在 Controller 中访问 dbContext 还是通过 web api?这完全是您的决定。
  • 我需要 MVC 控制器来处理我的视图和 Web api 控制器来为移动端提供数据访问希望是另一个开发人员的工作。 @ManishMishra
  • 我在这里没有看到任何问题,它们是两个独立的实体,应该保持这种状态。如果您确实想停止代码重复,那么您可以做的一件事是更新您的普通控制器以调用您的 API 服务,但这完全是您的调用
  • 是的,这就是我的问题,我如何在我的控制器中调用 API servir
  • 或者将您的数据访问代码放在存储库类中,并在 MVC 控制器和 WebApi 控制器中使用该类

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


【解决方案1】:

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

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

这是一个简单的存储库:

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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以只从 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        相关资源
        最近更新 更多