컨트롤러에 작업을 시작한 후 모델을 해결하는 방법을 찾고 있는데, 문제를 설명하는 가장 간단한 방법은 다음과 같습니다.
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;
});
}
}
My 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);
}
소스를 파고 들자 , 유망한 것들 ModelBinderFactory 와 ControllerActionInvoker를 보았습니다. 이 클래스들은 파이프 라인에서 모델 바인딩을 위해 사용됩니다.
QueryString에서 매개 변수 이름을 확인하기 위해 간단한 인터페이스를 노출해야합니다.
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");
그러나 모델 바인더에서 모델을 확인하는 유일한 방법은 가짜 컨트롤러 설명자를 만들고 많은 것을 조롱하는 것입니다.
관리자에게 늦게 바인딩 된 매개 변수를 어떻게 받아 들일 수 있습니까?