Bir denetleyicide bir eylem girdikten sonra bir modeli çözmek için bir yol arıyorum, sorunu tanımlamak için en basit yolu olurdu:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
Neden yapmaya çalıştığım hakkında daha fazla bilgi arıyorsanız, resmin tamamını almak için okumaya devam edebilirsiniz.
TL; DR
Ben her zaman sorgu dizesinden çözülecek bir parametre adı verilen bir modeli bir isteği çözmek için bir yol arıyorum Nasıl dinamik olarak başlangıçtaki filtreleri kaydedebilirsiniz. Filtrelerimi kaydettirecek bir sınıfım var.
Başlangıç sınıfımda dinamik olarak restServices ile filtreleri kaydedebilmek istiyorum. Kabaca şöyle görünüyor benim özel ControllerFeatureProvider geçmek için kullandığım bir seçenek var:
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;
});
}
}
Denetleyicim seçenekleri takip eder ve bunları uç noktaları ve OData disk belleği için filtreler sağlamak üzere kullanır.
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 verilen bir modeli dinamik olarak çözmek nasıl anlamaya sorun yaşıyorum, modeli elde etmek için böyle bir şey yapmayı düşünürdüm ama bu çalışmayan sözde kod
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);
}
Kaynağa Kazandıktan Sonra ModelBinderFactory ve ControllerActionInvoker'da bazı umut verici şeyler gördüm. Bu sınıflar boru hattında model bağlama için kullanılır,
Ben bir parametre adı QueryString, böyle bir şey çözmek için basit bir arayüz ortaya çıkarmak beklenir:
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");
Ancak, bir modeli model bağlayıcıdan çözmek için gördüğüm tek yol sahte denetleyici tanımlayıcıları oluşturmak ve bir sürü şeyi alay etmektir.
Geç bağlı parametreleri denetleyicime nasıl kabul edebilirim?