Saya sedang mencari cara untuk menyelesaikan model setelah masuk ke dalam aksi di controller, cara paling sederhana untuk menggambarkan masalah adalah:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
Jika Anda mencari informasi lebih lanjut tentang mengapa saya mencoba melakukan itu, Anda dapat terus membaca untuk mendapatkan gambaran lengkap
TL; DR
Saya sedang mencari cara untuk menyelesaikan permintaan model, mengingat nama parameter yang akan selalu diselesaikan dari string kueri Bagaimana saya bisa mendaftarkan filter secara dinamis dari startup. Saya memiliki kelas yang akan menangani pendaftaran filter saya.
Di kelas startup saya, saya ingin dapat mendaftarkan filter secara dinamis dengan restServices saya. Saya memiliki opsi yang saya gunakan untuk meneruskan ke ControllerFeatureProvider kustom saya yang kira-kira seperti ini:
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;
});
}
}
Kontroler saya akan melacak opsi dan menggunakannya untuk menyediakan filter untuk paging titik akhir dan 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>();
}
}
Saya mengalami kesulitan mencari tahu bagaimana menyelesaikan model secara dinamis mengingat HttpContext, saya akan berpikir untuk melakukan sesuatu seperti ini untuk mendapatkan model tetapi ini adalah pseudo-code yang tidak berfungsi
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);
}
Setelah Menggali Sumber, saya melihat beberapa hal yang menjanjikan ModelBinderFactory dan ControllerActionInvoker Kelas-kelas ini digunakan dalam pipa untuk model mengikat,
Saya berharap untuk mengekspos antarmuka sederhana untuk menyelesaikan nama parameter dari QueryString, sesuatu seperti ini:
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");
Namun, satu-satunya cara saya melihat untuk menyelesaikan model dari pengikat model adalah membuat deskriptor pengendali palsu dan mengejek banyak hal.
Bagaimana saya bisa menerima parameter terikat terlambat ke contoller saya?