Asp.net core 运行时类型的ASP.NET核心模型绑定

Asp.net core 运行时类型的ASP.NET核心模型绑定,asp.net-core,Asp.net Core,如何编写基于查询字符串创建模型实例的绑定器 公共类RpcBinder:IModelBinder { 公共任务BindModelAsync(ModelBindingContext bindingContext) { if(bindingContext==null) 抛出新ArgumentNullException(nameof(bindingContext)); 字符串modelName=bindingContext.modelName; ValueProviderResult ValueProv

如何编写基于查询字符串创建模型实例的绑定器

公共类RpcBinder:IModelBinder
{
公共任务BindModelAsync(ModelBindingContext bindingContext)
{
if(bindingContext==null)
抛出新ArgumentNullException(nameof(bindingContext));
字符串modelName=bindingContext.modelName;
ValueProviderResult ValueProviderResult=bindingContext.ValueProvider.GetValue(modelName);
//我自己获取程序集类型的方法
如果(!TryGetRequestType(valueProviderResult.FirstValue,out类型requestType))
返回Task.CompletedTask;
object modelInstance=Activator.CreateInstance(requestType);
//?调用modelInstance的[FromBody]
bindingContext.Result=ModelBindingResult.Success(modelInstance);
返回Task.CompletedTask;
}
}
[HttpPost(“rpc/{request:required}”)]
公共异步任务InvokeAsync([ModelBinder(typeof(RpcBinder))]对象请求,CancellationToken令牌)
{
...
}
并通过默认提供程序从请求正文填充此实例

我的解决方案:

公共类RpcBinder:IModelBinder
{
私有只读MVCOPIONS\u选项;
私有只读IHttpRequestStreamReaderFactory\u readerFactory;
私人只读iLogger工厂(loggerFactory);
公共RpcBinder(IOptions选项,
IHTT前传StreamReaderFactory readerFactory,
伊洛格工厂(伐木厂)
{
_选项=选项.值;
_readerFactory=readerFactory;
_loggerFactory=loggerFactory;
}
publicTask BindModelAsync(ModelBindingContext bindingContext)
{
if(bindingContext==null)
抛出新ArgumentNullException(nameof(bindingContext));
字符串modelName=bindingContext.modelName;
ValueProviderResult ValueProviderResult=bindingContext.ValueProvider.GetValue(modelName);
//通过自己的实现从程序集中获取模型类型
如果(valueProviderResult==valueProviderResult.None
||!TryGetRequestType(valueProviderResult.FirstValue,输出类型requestType))
返回Task.CompletedTask;
bindingContext.ModelMetadata=bindingContext.ModelMetadata.GetMetadataForType(requestType);
var bodyBinder=新的BodyModelBinder(_options.InputFormatters、_readerFactory、_loggerFactory、_options);
返回bodyBinder.BindModelAsync(bindingContext);
}
}