C# 验证并将ModelState从服务层传递到控制器WebAPI

C# 验证并将ModelState从服务层传递到控制器WebAPI,c#,asp.net-mvc,asp.net-core,asp.net-web-api,design-patterns,C#,Asp.net Mvc,Asp.net Core,Asp.net Web Api,Design Patterns,我按照下面的链接在服务层完成验证 我最终得到了循环依赖。所以,移除validation/ModelStateWrapper的依赖注入,并使用初始化静态方式 项目简介:我有API、服务层、存储库、数据库。我正在使用Automapper将DTO映射到实体。 控制器: public StudentController(IStudentService studentService, IMapper mapper) { _studentService = stud

我按照下面的链接在服务层完成验证

我最终得到了循环依赖。所以,移除validation/ModelStateWrapper的依赖注入,并使用初始化静态方式

项目简介:我有API、服务层、存储库、数据库。我正在使用Automapper将DTO映射到实体。 控制器:

public StudentController(IStudentService studentService, IMapper mapper)
        {
            _studentService = studentService;
            _studentService.Initialize(new ModelStateWrapper(this.ModelState));
            _mapper = mapper;
        } 

    public IActionResult CreateStudent([FromBody] StudentCreationDto student)
            {    
                if (student== null)
                {
                    return BadRequest();
                }                         
                if (!ModelState.IsValid)
                {
                    return new UnprocessableEntityObjectResult(ModelState);
                }
                var studentEnitty = _mapper.Map<Student>(student);
                var createSuccessful = _studentService.CreateStudent(studentEnitty);
                if (!createSuccessful)
                {                
                    return new UnprocessableEntityObjectResult(ModelState);
                }  
            }
我有一本带加法器的词典,是有效的。ModelStateWrapper实现IValidationDictionary

词典

public interface IValidationDictionary
    {
        void AddError(string key, string errorMessage);
        bool IsValid { get; }
    }
ModelStateWrapper

public class ModelStateWrapper : IValidationDictionary
    {       

        private ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelState)
        {
            _modelState = modelState;
        }

        #region IValidationDictionary Members


        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }          

        public bool IsValid
        {
            get { return _modelState.IsValid; }
        }

我试图在控制器级别和业务逻辑(如Student exists)级别获得数据模型验证。我能够执行验证,但是,我无法将模型状态返回到控制器,因为它表示有效。你能告诉我我遗漏了什么吗?

你遇到了问题,上面哪行代码?你好,Jasen,让我们说一下验证完成后,学生电子邮件已经存在。然后我希望能够将ModelState传递回控制器。控制器的构造函数中注入了一个服务实例。构造函数调用service.initialize并通过验证字典,验证字典又包含模型状态对象。因此,如果存在验证错误,CreateStudent方法应该返回false。另外,控制器应该返回模型状态,这就是我遇到的问题。我看到ModelState在控制器上仍然有效。您的意思是如果(!ModelState.IsValid)需要验证
在控制器上?您需要知道
ModelState。IsValid
表示是否可以将来自请求的传入值正确绑定到模型,以及在模型绑定过程中是否有任何明确指定的验证规则被破坏。您没有使用正确的格式自定义ModelState和请求的验证,所以ModelState在控制器上是有效的。Rena,我理解自定义验证。我希望稍后从业务逻辑或服务中获得验证,比如实体是否存在。这与ViewModel/DTO验证无关。如果您检查控制器,它的一部分最初完成了。Jasen,下面代码中的模型状态不是从服务层获取信息。你能帮忙吗?如果(!createSuccessful){返回新的不可处理EntityObjectResult(ModelState);}
public class ModelStateWrapper : IValidationDictionary
    {       

        private ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelState)
        {
            _modelState = modelState;
        }

        #region IValidationDictionary Members


        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }          

        public bool IsValid
        {
            get { return _modelState.IsValid; }
        }