【问题标题】:Sharing logic between WebApi and MVC controllers?在 WebApi 和 MVC 控制器之间共享逻辑?
【发布时间】:2014-01-05 23:14:04
【问题描述】:

我的应用程序有 MVC 控制器和 WebApi 控制器。到目前为止,我已经能够将控制器之间共享的任何逻辑分别推送到BaseController 和BaseApiController 中。

现在我遇到一种情况,API 控制器和 MVC 控制器都在做同样的事情——注册一个新的用户帐户。这个过程有点复杂,因为我有一个多租户应用程序,看起来像这样:

// MVCController : BaseController
public ActionResult Register(RegisterModel model) {
      // see if the model is valid
      // check and make sure the credentials check out with policy requirements
      // add the user to the user table if they aren't already there
      // create a tenancy
      // assign cookie
 }

大部分实际工作都被推到了服务层,但是调用和条件占用了大约 20 行代码,我不想将它们复制并粘贴到类似的 WebApi 控制器中。

所以我想知道我是否可以以某种方式让我的BaseController 和BaseApiController 从一个通用控制器继承,我可以在其中放置此身份验证代码。这里推荐的方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    除非我从您的问题中遗漏了什么,否则我会将这段代码重构为一个 Util 类,该类存在于您的 UI 项目中。然后你的 MVC 控制器和 WebAPI 控制器都可以调用它。

    这种方法符合Composition over inheritance design principle。

    【讨论】:

    • 是的,我会将帐户注册码提取到另一个类/接口中,以便您可以重复使用它。如果您为它定义一个接口,您将使您的代码更具可测试性并符合控制反转原则。
    【解决方案2】:

    如果您不能将逻辑移出到它自己的库中然后共享它,那么我可能会看到有关从 mvc 调用 web api 的信息。有关执行此操作的示例,请参阅此帖子:https://stackoverflow.com/a/13206631/426422

    【讨论】:

    • 是的...我绝对不喜欢将其推入自己的库,或将调用推入 HTTP 领域的想法。如果这是我仅有的两个选项,我宁愿复制代码:/
    • 你在担心什么?
    • 第一种方法的解决方案开销,第二种方法的性能。我知道这是最小的,但我宁愿复制代码而不是添加一堆毫秒。我疯了吗?
    • Web API 被简化。复制代码通常是不好的。看看这篇文章:odetocode.com/blogs/scott/archive/2013/07/01/…
    猜你喜欢
    • 2017-07-16
    • 2014-08-11
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多