MVC4客户端获取异步与调用业务逻辑/存储库以获取数据?

时间:2015-11-08 17:35:46

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

我们正在从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调用,具有异步编程的功能或直接访问存储库,或者如果有人可以建议混合两个?

1 个答案:

答案 0 :(得分:1)

当然是一个有趣的问题,我也必须做出这个决定。最有趣的部分是用户身份验证。 MVC和Web API都具有良好的身份验证过程。当然,API用于无状态http调用(在每个经过身份验证的请求上使用令牌),MVC使用cookie和所有其他内容。

对我来说,将这种身份验证分开是一个更好的选择,同时仍然指向同一个数据库,因此每次我想访问数据库时都不会调用我的API。即使您的API在同一台服务器上运行,我确信直接调用您的数据库会更快。

如果你做得对,我认为你没有那么多重复的代码。 首先,有一个应用程序核心项目,如果它更大,有一个数据库核心和一个Web核心。您的业​​务逻辑应该为您的应用程序执行业务。如果它是api或mvc应用程序,我假设您希望在两个应用程序中实现相同的目标:以安全和受控的方式获取或更新数据。但是,不要错误地做到这一点。在mvc / api项目的控制器中可以有一些逻辑。

从维护的角度来看:对你的BL进行类型安全调用然后通过API请求执行此操作会更加安全,这可能会在功能中发生变化(或者你必须在任何地方更新版本)。

建筑,这是一个有趣的世界。