Как передать, а затем связать словарь из параметра запроса URL со свойством модели, используя Nancy FX - PullRequest
0 голосов
/ 08 февраля 2020

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 недопустимо.

...