n层架构中的web api控制器

时间:2014-10-14 11:44:29

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

在我的n层.Net应用程序中,我得到了下一层:

  • 数据访问层(EF)
  • 业务层(验证和业务逻辑)
  • 表示层(1个MVC控制器和许多API控制器)

我发现,我的商业服务只验证业务对象,调用CRUD DAO方法并将结果返回给Api控制器。

所以,我怀疑:可能是Web Api控制器应该用作商业服务吗?

5 个答案:

答案 0 :(得分:3)

有趣的是,刚刚回答了类似的问题......

所以我不知道我是你。

这只是我头脑中方法的一些不足之处:

  1. 性能 - Web MVC项目中的冗余HTTP往返。
  2. 关注点分离 - 大部分时间是功能提供 通过API,相同的项目/应用程序的UI大不相同。您 可能希望通过严格的合同将API限制为几种方法。 如果您希望Web API成为Web MVC和DAL之间的层 您还必须公开UI所需的所有功能。 您也可能希望获得不同的授权 认证机制。通常API异常处理是 也有不同的输入验证。
  3. 维护 - 每次您需要进行UI所需的更改时 只有你必须确保它不会制止你的API客户端。也 API版本控制是一个非常重要的主题,并将其与大多数UI混合使用 改变使这个过程更加困难。
  4. 可能现在你的应用程序并不复杂,但从设计的角度来看,你的解决方案现在比你决定在你的UI和DAL层之间放置Web API要灵活得多。

答案 1 :(得分:1)

N-Tier应用程序和多层应用程序在新一波开发人员中并不受欢迎。请记住,仅仅因为某些事物在一个群体中不受欢迎,并不意味着它没有价值。

MVC的优点:

  • 分离关注
  • 单元测试

使用Web.API的多层MVC应用程序是否有价值:

我知道会遇到一些不满和分歧。但是,我担心的是单用途应用程序开发人员没有考虑企业开发。企业开发,负载平衡,可管理的代码维护以及真正的关注点分离只适用于可轻松适应N层的多层应用程序。

许多开发人员在要求他们在SQL中设计和实现数据结构,创建和维护模型和CRUD功能,开发控制器以及设计美观和友好视图的环境中运行。利用Entity Framework的MVC模型使这对于这些从小到中的平台开发人员来说是一个可管理的任务。

在企业版中,将业务和数据访问层与用户界面分开是非常有意义的。现在,MVC是一个流行且功能强大的平台,用于高效和可用的用户界面开发。十年内UI平台将会是什么?将UI与其他层分离可以为开发业务逻辑所花费的工作提供更多的生命。更不用说,它允许今天访问多个平台上的数据。

使用Web.API的多层MVC具有以下优势:

  • 真正的关注点分析
  • 支持单元测试
  • 使业务逻辑和数据访问逻辑比单独使用MVC更具可扩展性和可重用性。
  • 支持没有页面刷新的数据进程。 (REST)

CONS:   - 不容易支持使用Entity Framework。 (无论如何,这还没有为企业做好准备)

答案 2 :(得分:0)

您可以将您的代码作为模型的一部分,这甚至可以被视为关注点的良好分离,因为MVC是为此而构建的。

但我最喜欢做的是将逻辑保留在它自己的业务层中。我认为,原因是更好地分离关注点。我喜欢使用IoC,因此可能会有不同的配置我认为不同的运行解决方案。或者,我可能有另一个使用相同逻辑层的UI / API / Project。

至于开销,它有一点开销,但我觉得与它创建的代码中的实际开销相比有点麻烦。

答案 3 :(得分:0)

我同意这里的其他人,在研究使用强类型视图时,控制器只会创建一个viewmodel实例并将其发送到视图。然后,视图模型是数据服务层的中介。我个人在不同的项目中使用EF创建我的所有实体,只是为了分离功能。视图模型可以直接调用EF,也可以添加另一层预先封装的EF查询,Viewmodel只使用它来填充视图集合。这看起来像这样:

[查看] - [控制器] - [Viewmodel] - [EF的可选存储库和接口] --- [EF]

在EF界面中,您可以在尝试获取信息并根据您的设计回发到视图时捕获所有数据库错误。

强类型视图的优点在于它们可以在View中来回发布,并且可以包含您可以随意调用的方法。因为它们是视图的伪模型,所以它们还可以具有特定于视图的属性,这些属性可以在业务层使用。我通过视图模型有相当多的保证。 (毕竟它们只是一个指针)......

答案 4 :(得分:-1)

你可以在实际的模型/实体类而不是ApiControllers中实现业务逻辑/验证/ calucations,否则你最终会在控制器中得到如此多的代码并不是一件好事。

此外,您可以使用DataAnnotations属性来执行位于控制器之外的验证。 for.e.g. http://msdn.microsoft.com/en-us/library/ee256141(v=vs.100).aspx