Tôi đang tìm cách giải quyết một mô hình sau khi tham gia vào một hành động trong bộ điều khiển, cách đơn giản nhất để mô tả vấn đề sẽ là:
public DTO[] Get(string filterName)
{
//How can I do this
this.Resolve<MyCustomType>("MyParamName");
}
Nếu bạn đang tìm kiếm thêm thông tin về lý do tại sao tôi đang cố gắng làm điều đó, bạn có thể tiếp tục đọc để có được hình ảnh đầy đủ
TL; DR
Tôi đang tìm cách giải quyết một yêu cầu mô hình, được đặt tên tham số sẽ luôn được giải quyết từ chuỗi truy vấn Làm cách nào tôi có thể tự động đăng ký các bộ lọc từ khi khởi động. Tôi có một lớp học sẽ xử lý việc đăng ký các bộ lọc của tôi.
Trong lớp khởi động của tôi, tôi muốn có thể tự động đăng ký các bộ lọc với dịch vụ restService của mình. Tôi có một tùy chọn mà tôi đang sử dụng để chuyển đến Trình điều khiển tùy chỉnh của mình, trông giống như vậy:
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;
});
}
}
Bộ điều khiển của tôi sẽ theo dõi các tùy chọn và sử dụng chúng để cung cấp các bộ lọc cho các điểm cuối phân trang và 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>();
}
}
Tôi gặp khó khăn khi tìm cách giải quyết một cách linh hoạt một mô hình được cung cấp cho HTTPContext, tôi sẽ nghĩ phải làm một cái gì đó như thế này để có được mô hình nhưng đây là mã giả không hoạt động
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);
}
Sau khi đào sâu vào Nguồn, tôi đã thấy một số điều đầy hứa hẹn ModelBinderFactory và ControllerActionInvoker Các lớp này được sử dụng trong đường ống để liên kết mô hình,
Tôi hy vọng sẽ hiển thị một giao diện đơn giản để phân giải tên tham số từ QueryString, đại loại như thế này:
ModelBindingContext context = new ModelBindingContext();
return context.GetValueFor<T>("MyParamName");
Tuy nhiên, cách duy nhất tôi thấy để giải quyết một mô hình từ chất kết dính mô hình là tạo các mô tả bộ điều khiển giả và giả định hàng tấn thứ.
Làm thế nào tôi có thể chấp nhận các tham số ràng buộc muộn vào contug của tôi?