ฉันกำลังมองหาวิธีแก้ไขโมเดลหลังจากเข้าสู่การกระทำในคอนโทรลเลอร์วิธีที่ง่ายที่สุดในการอธิบายปัญหาคือ:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
หากคุณกำลังมองหาข้อมูลเพิ่มเติมว่าทำไมฉันถึงพยายามทำเช่นนั้นคุณสามารถอ่านต่อเพื่อรับภาพเต็ม
TL; DR
ฉันกำลังมองหาวิธีในการแก้ไขแบบจำลองคำขอโดยกำหนดชื่อพารามิเตอร์ที่จะได้รับการแก้ไขจากสตริงข้อความค้นหาฉันจะลงทะเบียนตัวกรองแบบไดนามิกได้อย่างไรจากการเริ่มต้น ฉันมีชั้นเรียนที่จะจัดการกับการลงทะเบียนตัวกรองของฉัน
ในระดับเริ่มต้นของฉันฉันต้องการที่จะสามารถลงทะเบียนตัวกรองแบบไดนามิกกับส่วนที่เหลือของฉันบริการ ฉันมีตัวเลือกที่ฉันใช้ส่งผ่านไปยัง 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;
});
}
}
ตัวควบคุมของฉันจะติดตามตัวเลือกและใช้ตัวเลือกเหล่านี้เพื่อให้ตัวกรองสำหรับจุดสิ้นสุดการเพจและ 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");
อย่างไรก็ตามวิธีเดียวที่ฉันเห็นการแก้ไขโมเดลจากตัวยึดโมเดลคือการสร้างตัวอธิบายคอนโทรลเลอร์ปลอมและจำลองสิ่งต่างๆ
ฉันจะยอมรับพารามิเตอร์ที่ จำกัด ไว้ในโปรแกรมควบคุมของฉันได้อย่างไร