4

我正在使用 Devexpress XPO 作为 ORM,我将使用 ASP.NET 核心创建一个 OData Web API。Devexpress 在 ASP.NET 经典中创建了一个示例,我有一个无法“转换”的代码行(在 CS/ODataService/Globals.asax.cs 中,第 13 行),因为在 ASP.NET 核心中似乎没有对应物:

GlobalConfiguration.Configuration.Services.Replace(typeof(IBodyModelValidator), new CustomBodyModelValidator());

首先,我对 ...Services.Replace 感到困惑,因为我没有在核心中找到合适的“命令”,而且(最重要的)核心似乎与 IBodyModelValidator 没有对应物。我将如何将其“转换”为 ASP.NET 核心?

任何建议,将不胜感激!

4

1 回答 1

0

我知道这很旧,但这是我在寻找答案时遇到的第一篇文章。这是我解决问题的方法:

public class CustomBodyModelValidator : ObjectModelValidator
{
    public CustomBodyModelValidator(IModelMetadataProvider modelMetadataProvider, IList<IModelValidatorProvider> validatorProviders) 
        : base(modelMetadataProvider, validatorProviders) { }

    public override ValidationVisitor GetValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider,
        ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState)
    {
        return new(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
        {
            ValidateComplexTypesIfChildValidationFails = true
        };
    }
    
    public override void Validate(ActionContext actionContext, ValidationStateDictionary validationState, string prefix, object model,
        ModelMetadata metadata, object container)
    {            
        //TODO: put your logic here
        
        base.Validate(actionContext, validationState, prefix, model, metadata, container);
    }
}

然后将其注册到Startup.cs

services.AddSingleton<IObjectModelValidator>(provider =>
{
    var metadataProvider = provider.GetRequiredService<IModelMetadataProvider>();
    var options = provider.GetRequiredService<IOptions<MvcOptions>>().Value;
    return new CustomBodyModelValidator(metadataProvider, options.ModelValidatorProviders);
});
于 2021-02-10T15:22:26.913 回答