gpt4 book ai didi

c# - 进入 Controller 后后期绑定(bind)动态解析模型

转载 作者:行者123 更新时间:2023-12-04 04:23:44 24 4
gpt4 key购买 nike

我正在寻找一种在 Controller 中输入操作后解决模型的方法,描述问题的最简单方法是:

public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}

如果您正在寻找有关我为什么要这样做的更多信息,您可以继续阅读以获取完整信息

TL;DR

我正在寻找一种解决模型请求的方法,给定一个始终从查询字符串解析的参数名称如何从启动中动态注册过滤器。我有一个类将处理注册我的过滤器。

在我的启动类中,我希望能够使用我的 restServices 动态注册过滤器。我有一个用于传递给我的自定义 ControllerFeatureProvider 的选项,大致如下所示:
public class DynamicControllerOptions<TEntity, TDTO>
{
Dictionary<string, Func<HttpContext, Expression<Func<TEntity, bool>>>> _funcNameToEndpointResolverMap
= new Dictionary<string, Func<HttpContext, Expression<Func<TEntity, bool>>>>();
Dictionary<string, List<ParameterOptions>> _filterParamsMap = new Dictionary<string, List<ParameterOptions>>();

public void AddFilter(string filterName, Expression<Func<TEntity, bool>> filter)
{
this._funcNameToEndpointResolverMap.Add(filterName, (httpContext) => filter);
}
public void AddFilter<T1>(string filterName, Func<T1, Expression<Func<TEntity, bool>>> filterResolver,
string param1Name = "param1")
{
var parameters = new List<ParameterOptions> { new ParameterOptions { Name = param1Name, Type = typeof(T1) } };
this._filterParamsMap.Add(filterName, parameters);
this._funcNameToEndpointResolverMap.Add(filterName, (httpContext) => {
T1 parameter = this.ResolveParameterFromContext<T1>(httpContext, param1Name);
var filter = filterResolver(parameter);
return filter;
});
}
}

我的 Controller 将跟踪选项并使用它们为分页端点和 OData 提供过滤器。
public class DynamicControllerBase<TEntity, TDTO> : ControllerBase
{
protected DynamicControllerOptions<TEntity, TDTO> _options;
//...

public TDTO[] GetList(string filterName = "")
{
Expression<Func<TEntity, bool>> filter =
this.Options.ResolveFilter(filterName, this.HttpContext);
var entities = this._context.DbSet<TEntity>().Where(filter).ToList();
return entities.ToDTO<TDTO>();
}
}

我无法弄清楚如何在给定 HttpContext 的情况下动态解析模型,我想做这样的事情来获取模型,但这是行不通的伪代码
private Task<T> ResolveParameterFromContext<T>(HttpContext httpContext, string parameterName)
{
//var modelBindingContext = httpContext.ToModelBindingContext();
//var modelBinder = httpContext.Features.OfType<IModelBinder>().Single();
//return modelBinder.BindModelAsync<T>(parameterName);
}

深挖源码后,看到了一些有希望的东西 ModelBinderFactoryControllerActionInvoker这些类在管道中用于模型绑定(bind),

我希望公开一个简单的接口(interface)来从 QueryString 解析参数名称,如下所示:
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");

但是,我看到从模型绑定(bind)器中解析模型的唯一方法是创建假 Controller 描述符并模拟大量事物。

如何将后期绑定(bind)参数接受到我的 Controller 中?

最佳答案

我同意你的想法

services need to filter data from get list, but I dont want to have to write an entire service of all I need to to provide a filter



为什么要为每个可能的组合编写一个小部件/过滤器/端点?

只需提供基本操作即可获取所有数据/属性。然后使用 GraphQL 允许最终用户将其过滤(模型)为 他们的需要。

来自 GraphQL
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools .

关于c# - 进入 Controller 后后期绑定(bind)动态解析模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com