带有DAL、Repo、Service、API层的n层架构:每层应该处理什么类型的对象,以及验证/映射应该发生在哪里

本文关键字:对象 验证 在哪里 映射 类型 什么 Repo 层的 API 处理 带有 | 更新日期: 2023-09-27 18:11:44

我认为我的应用程序至少应该有以下几层:

  • DAL(无通用接口;从数据库获取数据,从另一个web服务获取数据,从文件获取数据)
  • 存储库(每个重要/根聚合的CRUD接口);实现因源而异)
  • 服务(使用存储库接口;实现因业务逻辑而异)
  • Web API(封装服务;安装容器;实现因运行时参数(/config)而异

我知道我的Web API应该返回DTO,我将其解释为c#对象,除了自动实现的公共属性之外什么都没有。

理论上,有时我需要做BigComplicatedServiceCommand,其中一个工作单元将涉及多个存储库,但其他时候我的Web API可能会直接调用存储库,因为它只是做CRUD。

我有兴趣了解从(通过web api模型绑定输入到web服务)DTO到服务需要的任何映射应该发生在哪里,以及验证应该在哪里发生。

大致说来,我的想法是:

在API

  1. 接收请求并映射到路由
  2. 使用模型绑定器按约定绑定到DTO
  3. 使用IoC容器实例化特定控制器
  4. 运行特定控制器动作
  5. 在控制器动作中,封装对服务层的调用

现在,在步骤5之后是有问题的。我是否需要将DTO发送到服务中心?然后,我的服务将与我的DTO相结合。

我是否为每个服务方法定义一个特定的接口?如果是这样,它们实际上就是它们自己的DTO,我不妨为每个服务输入排列定义一个DTO。

假设我的服务接收DTO,

  1. 在service方法中,执行业务逻辑和调用存储库
  2. 在仓库中,CRUD的东西
  3. 返回服务方法到API的最终结果
  4. 转换到DTO并从API返回到Internet

现在,我的存储库应该严格处理Domain对象吗?如果是这样,谁负责选角?(服务)

最后,考虑到验证,我在想:

  • 使用以下方法之一进行预先验证:ModelStateActionFilter(在操作执行之前),在转换到服务需要作为输入的任何内容期间。因此,这将确保CreateUserService正在接收具有UsernamePassword的对象。
  • 验证使用存储库和其他服务的服务方法,用户名是唯一的,密码足够强
  • 在DAL级别验证以确保实体框架正常

我的问题是,我应该把System.DataAnnotations放在哪个(如果有的话)对象?在这个堆栈中是否有任何类型的模型应该在任何部分负责自己的验证?

谢谢你的哲学帮助。

带有DAL、Repo、Service、API层的n层架构:每层应该处理什么类型的对象,以及验证/映射应该发生在哪里

这个问题…

由于你的问题很长,我可能会遗漏一些要点,但我们开始吧。顺便说一下,这些都是"我的观点",你应该改变你认为合适的东西,以更好地满足你的需求。

  1. 去掉"N-Tier"字样。这些天很酷的孩子都在用"洋葱架构"

  2. 从一个"核心"项目开始。这是所有核心对象所在的位置。您将拥有一个客户、一个订单、一个产品等。在这个级别上,不必担心数据库、Web API或UI。你的对象应该有方法、属性和行为。这里的一切都不应该是Public { get; set; }。哦,是的,如果你在这里不明确需要接口,就不要使用接口。

  3. 在您的"Core"项目之后,您可以担心如何存储这些对象。您可以创建一个"Repository/DAL"项目。您的存储库应该采用您的聚合根。它的工作是弄清楚如何把它放在数据库中。

  4. 现在是"Service"项目。服务很容易。你的服务负责:从存储库获取对象,调用对象的方法,把对象放回存储库。现在,您的服务可以返回或接受"核心"对象,或者公开它们自己的dto。

  5. 你的WEB API/MVC项目将有你与用户的交互。它将调用Service来获取它想要的任何东西。在这里,你可以使用视图模型来呈现给用户,而不是核心对象。

—ok, that't it—

但这里有一些明确的回答你的问题:

  1. Web Api不应该直接调用repository

  2. 从你的服务返回到Web Api DTO/View Model的映射应该发生在Web Api项目中。

  3. 验证:Web Api可以验证一切以帮助用户。此外,核心应该验证好,核心内容等等……

  4. 不要为每个服务定义接口。如果只有一种实现,它可能不应该是接口。

  5. 在Service方法中,你不做业务逻辑。

  6. 是的,存储库严格使用核心/域对象。是的,服务工作给他们。

  7. 系统。数据注解进入Web Api "View/Models/DTOs"