Web Api Framework: Nancy Fx 1.4.2
Мне нужно передать словарь (как часть сложного фильтра) в URL и связать его с моей моделью.
attribute [" first "] =" one ";
attribute [" second "] =" 2 ";
attribute [" 3 "] =" three ";
Итак, URL может выглядеть так:
http://localhost/products?attributes [первый] = один & атрибуты [второй] = 2 & атрибуты [3] = три & orderby = id & filterby = name
public class RequestWithFilter
{
// ... other properties
///
/// possible implementation of my attribute dictionary. Or it can be a custom type.
///
public Dictionary<string, string> Attributes {get; set;}
}
Итак хотя у меня много стандартных свойств для привязки, я не хочу повторно реализовывать 80% DefaultBinder, но я бы хотел использовать его повторно (в методе Bind?). Проблема со следующей реализацией состоит в том, что она никогда не вызывалась:
public class RequestWithFilterBinder : DefaultBinder
{
public object Bind(NancyContext context, Type modelType, object instance, BindingConfig configuration, params string[] blackList)
{
var baseInstance = base.Bind(context, modelType, instance, configuration, blackList);
var request = baseInstance as RequestWithFilter;
// Customize my binding here ....
return request;
}
public TestKeyValueRequestBinder(IEnumerable<ITypeConverter> typeConverters, IEnumerable<IBodyDeserializer> bodyDeserializers, IFieldNameConverter fieldNameConverter, BindingDefaults defaults) : base(typeConverters, bodyDeserializers, fieldNameConverter, defaults)
{
}
}
Проблема с другим подходом заключается в том, что мне следует заново реализовать logi c связывателя по умолчанию, а затем добавить 5% от моего собственного изменения.
public class RequestWithFilterBinder : IModelBinder
{
public object Bind(NancyContext context, Type modelType, object instance, BindingConfig configuration, params string[] blackList)
{
// I can't call base.Bind() method or create an instance of the DefaultBinder (no params for constructor)
// var baseInstance = base.Bind (context, modelType, instance, configuration, blackList);
// Need to implement default binder first...
return request;
}
}
Вопросы 1. Как повторно использовать связыватель по умолчанию для его расширения? 2. Или, если есть лучший способ реализовать словарь в строке запроса GET, пожалуйста, поделитесь. Структура запроса гибкая.
PS Несмотря на то, что это метод GET и фильтры (могут быть вставлены в виде копии как URL), использование тела с JSON недопустимо.