Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FluentValidation中间件在.NETCore WebAPI中是否足够,还是应该在服务层中再次验证?_C#_Validation_.net Core_Asp.net Core Webapi_Fluentvalidation - Fatal编程技术网

C# FluentValidation中间件在.NETCore WebAPI中是否足够,还是应该在服务层中再次验证?

C# FluentValidation中间件在.NETCore WebAPI中是否足够,还是应该在服务层中再次验证?,c#,validation,.net-core,asp.net-core-webapi,fluentvalidation,C#,Validation,.net Core,Asp.net Core Webapi,Fluentvalidation,我有一个非常简单的三层ASP.NET核心WebAPI应用程序: 域-具有实体、数据接口、服务和DTO对象(它们是唯一的输入和输出对象)。因此,“域的接口”是接受输入DTO并返回输出DTO的服务 基础架构-实施数据接口(数据存储库)和CodeFirst迁移 WebAPI-标准ASP.NET核心3.1 Web API项目 WebAPI项目在控制器中返回“输出”DTO。对于接受有效负载的端点,使用“输入”DTO。控制器与域中的服务非常相似。控制器向世界公开域服务(显然是域的接口) 但接下来是验证。。。

我有一个非常简单的三层
ASP.NET核心WebAPI
应用程序:

  • -具有
    实体
    数据接口
    服务
    DTO
    对象(它们是唯一的输入和输出对象)。因此,“域的接口”是接受输入DTO并返回输出DTO的服务
  • 基础架构-实施
    数据接口
    (数据存储库)和CodeFirst迁移
  • WebAPI-标准ASP.NET核心3.1 Web API项目 WebAPI项目在控制器中返回“输出”DTO。对于接受有效负载的端点,使用“输入”DTO。控制器与域中的服务非常相似。控制器向世界公开域服务(显然是域的接口)

    但接下来是验证。。。我熟悉FluentValidation和ASP.NET核心管道-这是一个很棒的中间件:

            services.AddControllers()
                .AddFluentValidation(opt =>
                {
                    opt.RegisterValidatorsFromAssemblyContaining(typeof(PersonInputValidator));
                });
    
    我为每个“输入”DTO实现验证,这非常有效,但是。。。我不确定这是否足够。如果你选择任何服务类,它几乎没有经过验证。在技术上验证控制器输入的是.NET核心中间件

    我应该在服务中再次“双重验证”吗?
    如果是这样的话,有没有一种平滑的方法可以重用我已有的验证器?

    您不必运行两次验证。应该验证web API中的数据。如果您将服务与web API之外的任何其他接口一起使用,您也可以在那里实现流畅的验证。
    下面是一个实现流畅验证的好例子:

    对于服务层和表示层,我通常会在服务层执行FV实现/dto验证。这样,服务就可以被重用,验证也随之进行。 它还允许您保持控制器的精益。
    在控制器中,可能有特定于表示层的检查/验证的范围,例如模型绑定失败。但这可能只是一个基本的模型状态实现,我不会把FV放在这上面。

    FluentValidations可以在控制器中使用,同时也可以保持精简。在业务层中,还可以添加其他验证规则,但模型状态是在WebApi级别检查的,该级别是系统的网关。FluentValidation使用中间件,因此即使验证失败也不会命中控制器。 我还建议实现中间件,将业务层抛出的任何异常转换为适当的http状态代码,这也使控制器非常干净。
    在业务层中,有时也会使用验证规则,例如,当您希望检查是否存在依赖数据时。

    如果您认为您将拥有其他消费层,而不仅仅是通过WebAPI(例如XAML应用程序),则在服务层中进行验证是有意义的。如果您确定WebAPI是您唯一的服务使用者,请保持简单。您能否给出一个在服务层中使用FV的简单示例,以及演示层如何使用验证,以便在您的回答中明确此方法