我们正在从Web表单迁移到MVC4体系结构。我们将Web API和MVC放在同一个解决方案中。所以我们几乎没有选择:
1)我们可以从我们的MVC控制器调用Web API,就像其他客户端一样: var response = await client.GetAsync(“api / method”);
由于MVC和Web API都在同一个项目中,我们很困惑这个额外的HTTP调用是否合理,如果我们直接访问repository / businessLayer,就像我们在Web上做的那样API。 (代码重复很少,但性能优势)
2)我们有很多资源有多个这样的请求。例如,我们必须调用8-10个不同的存储库来获取数据。
可能的解决方案(我们应该如何从MVC控制器获取数据): 1)我们应该通过client.GetAsync方法调用这些多个存储库,它会异步地从存储库中提取所有数据。异步意味着并行逻辑会更快。 Con是我们一直有额外的HTTP调用来调用不同的API。 要么 2)我们是否应该按照这些Web API最终直接调用这些8-10个存储库?我没有看到这样的好处,因为它是同步的。唯一的好处是我们在这里避免额外的HTTP调用。但这需要额外代码的额外费用。 (从Web API和MVC访问相同的BL / Repository代码)。我不知道是否可以使用一些异步方法从MVC控制器调用存储库?
我们应该选择哪一个?一个额外的HTTP调用,具有异步编程的功能或直接访问存储库,或者如果有人可以建议混合两个?
答案 0 :(得分:1)
当然是一个有趣的问题,我也必须做出这个决定。最有趣的部分是用户身份验证。 MVC和Web API都具有良好的身份验证过程。当然,API用于无状态http调用(在每个经过身份验证的请求上使用令牌),MVC使用cookie和所有其他内容。
对我来说,将这种身份验证分开是一个更好的选择,同时仍然指向同一个数据库,因此每次我想访问数据库时都不会调用我的API。即使您的API在同一台服务器上运行,我确信直接调用您的数据库会更快。
如果你做得对,我认为你没有那么多重复的代码。 首先,有一个应用程序核心项目,如果它更大,有一个数据库核心和一个Web核心。您的业务逻辑应该为您的应用程序执行业务。如果它是api或mvc应用程序,我假设您希望在两个应用程序中实现相同的目标:以安全和受控的方式获取或更新数据。但是,不要错误地做到这一点。在mvc / api项目的控制器中可以有一些逻辑。
从维护的角度来看:对你的BL进行类型安全调用然后通过API请求执行此操作会更加安全,这可能会在功能中发生变化(或者你必须在任何地方更新版本)。
建筑,这是一个有趣的世界。