मैं एक नियंत्रक में एक कार्रवाई में प्रवेश करने के बाद एक मॉडल को हल करने का एक तरीका ढूंढ रहा हूं, समस्या का वर्णन करने का सबसे सरल तरीका होगा:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
यदि आप इस बारे में अधिक जानकारी की तलाश कर रहे हैं कि मैं ऐसा क्यों करना चाह रहा हूं तो आप पूरी तस्वीर पाने के लिए पढ़ना जारी रख सकते हैं
टी एल; डॉ
मैं एक मॉडल को एक अनुरोध को हल करने का एक तरीका ढूंढ रहा हूं, एक पैरामीटर नाम दिया गया है जो हमेशा क्वेरी स्ट्रिंग से हल किया जाएगा मैं स्टार्टअप से फ़िल्टर को गतिशील रूप से कैसे पंजीकृत कर सकता हूं। मेरे पास एक वर्ग है जो मेरे फ़िल्टर को पंजीकृत करने का काम करने वाला है।
अपने स्टार्टअप क्लास में मैं अपने रेस्ट सर्विसेज के साथ फिल्टर को गतिशील रूप से पंजीकृत करने में सक्षम होना चाहता हूं। मेरे पास एक विकल्प है जो मैं अपने कस्टम कंट्रोलर के पास जाने के लिए उपयोग कर रहा हूं। Piderider जो लगभग ऐसा दिखता है:
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;
});
}
}
मेरा नियंत्रक विकल्पों का ट्रैक रखेगा और पेजिंग एंडपॉइंट्स और ओडाटा के लिए फिल्टर प्रदान करने के लिए उनका उपयोग करेगा।
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 और नियंत्रकअभियोजनइंवर इन वर्गों का उपयोग मॉडल बाइंडिंग के लिए पाइपलाइन में किया जाता है,
मैं इस तरह से कुछ, क्वेरीरीरिंग से एक पैरामीटर नाम को हल करने के लिए एक सरल इंटरफ़ेस को उजागर करने की उम्मीद करूंगा:
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");
हालांकि, मॉडल बाइंडर से एक मॉडल को हल करने का एकमात्र तरीका मुझे नकली नियंत्रक विवरण बनाने और एक टन चीजों को मॉक करने का है।
मैं अपने कॉनोलर में देर से बाध्य मापदंडों को कैसे स्वीकार कर सकता हूं?