FluentValidation.AspNetCore在类库中不起作用 [英] FluentValidation.AspNetCore is not working in Class Library

查看:395
本文介绍了FluentValidation.AspNetCore在类库中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在项目中的.netcore WebApi中使用库"FluentValidation.AspNetCore": "6.4.0-beta3".您可以在下面看到项目结构.如果将CurrencyDTO.cs代码放在第2节(Project FH.WebAPI)中,并且如果将相同的代码放在第1节(Class Library DTO)中,则库工作正常.要求是我必须将代码放在类库FH.Common中.周围有什么解决办法.我已经搜索了,但是没有找到任何东西

项目结构

CurrencyDTO.cs

[Validator(typeof(CurrencyDTOValidator))]
    public class CurrencyDTO
    {
        public int Id { get { return CurrencyId; } }
        public int CurrencyId { get; set; }
        public string Name { get; set; }
        public string Symbol { get; set; }

    }

    public class CurrencyDTOValidator : AbstractValidator<CurrencyDTO>
    {
        public CurrencyDTOValidator()
        {
            RuleFor(x => x.Name).NotEmpty().NotNull().WithMessage("The currency 'Name' is required.")
                                      .Length(0, 250).WithMessage("The currency 'Name' cannot be more than 250 characters.");

            RuleFor(x => x.Symbol).NotEmpty().WithMessage("The currency Symbol is required.");


        }
    }

库配置

步骤1).添加project.json

{
  "dependencies": {
    "Autofac": "4.3.0",
    "Autofac.Extensions.DependencyInjection": "4.0.0",
    "AutoMapper": "5.2.0",
    "EntityFramework": "6.1.3",
    "FH.Business": "1.0.0-*",
    "FH.Common": "1.0.0-*",
    "JWT": "1.4.1-beta",
    "Microsoft.AspNet.Http.Extensions": "1.0.0-rc1-final",
    "Microsoft.AspNet.WebApi.Client": "5.2.3",
    "Microsoft.AspNet.WebApi.Core": "5.2.3",
    "Microsoft.AspNetCore.Authentication.JwtBearer": "1.1.0",
    "Microsoft.AspNetCore.Diagnostics": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    //other libraries..
    "FluentValidation.AspNetCore": "6.4.0-beta3" //<------Here 
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "net461": {
      "frameworkAssemblies": {
        "System.Drawing": "4.0.0.0"
      }
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

步骤2).在Startup.cs

   public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                services.AddMvc(options => {  }).AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>());
// Other code..
             }

在控制器中使用

[HttpPost]
        [Route("CreateCurrency")]
        public IActionResult CreateCurrency([FromBody] CurrencyDTO model)
        {
            if (!ModelState.IsValid) //<----Validate here
            {
                return new BadRequestObjectResult(ModelState);
            }
        //Other Code..
        }

解决方案

问题出在startup.cs中的注册行中,感谢@JeremySkinner向我提出了正确的建议,并在此引用他的回答.

我的错误

services.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>());

替换

RegisterValidatorsFromAssemblyContaining<Startup>() 

RegisterValidatorsFromAssemblyContaining<CurrencyDTOValidator>()

到问题的实际链接

链接说明

上面的链接是@JeremySkinner发布的答案

I am using library "FluentValidation.AspNetCore": "6.4.0-beta3" in .netcore WebApi in a project. You can see the project structure below. Library is working fine if i place the CurrencyDTO.cscode in section 2 (Project FH.WebAPI) and if the same code placed in section 1 (Class Library DTO) its not working. And requirement is that i have to place code in Class library FH.Common. Is there any work around.I have search but didn't find any thing

Project Structure

CurrencyDTO.cs

[Validator(typeof(CurrencyDTOValidator))]
    public class CurrencyDTO
    {
        public int Id { get { return CurrencyId; } }
        public int CurrencyId { get; set; }
        public string Name { get; set; }
        public string Symbol { get; set; }

    }

    public class CurrencyDTOValidator : AbstractValidator<CurrencyDTO>
    {
        public CurrencyDTOValidator()
        {
            RuleFor(x => x.Name).NotEmpty().NotNull().WithMessage("The currency 'Name' is required.")
                                      .Length(0, 250).WithMessage("The currency 'Name' cannot be more than 250 characters.");

            RuleFor(x => x.Symbol).NotEmpty().WithMessage("The currency Symbol is required.");


        }
    }

Library Configuration

Step 1) . Add in project.json

{
  "dependencies": {
    "Autofac": "4.3.0",
    "Autofac.Extensions.DependencyInjection": "4.0.0",
    "AutoMapper": "5.2.0",
    "EntityFramework": "6.1.3",
    "FH.Business": "1.0.0-*",
    "FH.Common": "1.0.0-*",
    "JWT": "1.4.1-beta",
    "Microsoft.AspNet.Http.Extensions": "1.0.0-rc1-final",
    "Microsoft.AspNet.WebApi.Client": "5.2.3",
    "Microsoft.AspNet.WebApi.Core": "5.2.3",
    "Microsoft.AspNetCore.Authentication.JwtBearer": "1.1.0",
    "Microsoft.AspNetCore.Diagnostics": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    //other libraries..
    "FluentValidation.AspNetCore": "6.4.0-beta3" //<------Here 
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "net461": {
      "frameworkAssemblies": {
        "System.Drawing": "4.0.0.0"
      }
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

Step 2). In Startup.cs

   public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                services.AddMvc(options => {  }).AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>());
// Other code..
             }

Used in Controller

[HttpPost]
        [Route("CreateCurrency")]
        public IActionResult CreateCurrency([FromBody] CurrencyDTO model)
        {
            if (!ModelState.IsValid) //<----Validate here
            {
                return new BadRequestObjectResult(ModelState);
            }
        //Other Code..
        }

解决方案

The problem was in a registration line in startup.csand thank to @JeremySkinner who have suggested me the right way and i am quoting his answer here.

My mistake

services.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>());

Replace

RegisterValidatorsFromAssemblyContaining<Startup>() 

with

RegisterValidatorsFromAssemblyContaining<CurrencyDTOValidator>()

Actual link to the Issue

Link Description

Above link is the answers posted @JeremySkinner

这篇关于FluentValidation.AspNetCore在类库中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆