В WebAPI как использовать CustomCreationConverter для возврата Castle DictionaryAdapter для привязки параметров интерфейса?

Я работаю с Microsoft WebAPI с помощью сериализатора Json.NET и пытаюсь использовать привязку параметров контроллера для создания экземпляра Castle DictionaryAdapter в качестве десериализованного объекта из JSON. (Это позволит нам определить, установлены ли для некоторых свойств значения NULL в JSON или значения по умолчанию, равные NULL, поскольку их нет в JSON, без необходимости отказаться от встроенного механизма синтаксического анализа и привязки.)

Но это не работает, потому что новый объект исчезает между созданием и передачей контроллеру.

Контроллер объявлен с параметром интерфейса:

  public interface IMessageModel
  {
      string Message { get; set; }
  }
.
.
.
  public HttpResponseMessage Patch(IMessageModel model)

Я хочу, чтобы десериализатор создал экземпляр Castle DictionaryAdapter, который реализует IMessageModel.

Для этого я создал подкласс CustomCreationConverter, который создается с помощью DictionaryAdapterFactory и который переопределяет метод Create() для возврата динамического объекта Castle:

  public class MessageModelConverter
      : CustomCreationConverter<IMessageModel>
  {
      private DictionaryAdapterFactory m_adapterFactory;
      public MessageModelConverter(DictionaryAdapterFactory adapterFactory)
      {
          m_adapterFactory = adapterFactory;
      }
      public override IMessageModel Create(Type objectType)
      {
          IMessageModel model = m_adapterFactory
              .GetAdapter<IMessageModel>(new Hashtable());
          return model;
      }
  }

Затем я добавляю средство форматирования в объект HttpConfiguration примерно так:

  DictionaryAdapterFactory adapterFactory = new DictionaryAdapterFactory();
  config.Formatters.JsonFormatter.SerializerSettings.Converters
      .Add(new MessageModelConverter(adapterFactory));

Проходя через отладчик, я могу подтвердить, что MessageModelConverter используется и что Create() вызывается, создает и возвращает прокси-замок для модели, реализующей IMessageModel. Однако когда вызывается контроллер, параметр модели имеет значение null. Каким-то образом экземпляр класса исчезает между созданием в конвертере и использованием в контроллере.

Тем не менее, если я изменю Create на использование конкретного класса, который реализует IMessageModel, все работает нормально, и модель отображается на контроллере:

  public class MessageModel : IMessageModel
  {
      public string Message { get; set; }
  }
.
.
.
      public override IMessageModel Create(Type objectType)
      {
          IMessageModel model = new MessageModel();
          return model;
      }

Кроме того, я могу объявить оболочку, которая реализует IMessageModel и делегирует все вызовы другому объекту интерфейса, что-то вроде этого:

  public class MessageModelWrapper : IMessageModel
  {
      public IMessageModel ContainedModel;
      public MessageModelWrapper(IMessageModel containedModel)
      {
          ContainedModel = containedModel;
      }
      public string Message
      {
          get { return ContainedModel.Message; }
          set { ContainedModel.Message = value; }
      }
  }

Затем я реализую Create() следующим образом:

  public override IMessageModel Create(Type objectType)
  {
      IMessageModel model = m_adapterFactory
          .GetAdapter<IMessageModel>(new Hashtable());
      model = new MessageModelWrapper(model);
      return model;
  }

Это позволяет мне переправлять в Castle DictionaryAdapter, и это тоже работает отлично. Оболочка модели поступает в контроллер, и я могу извлечь прокси адаптера словаря.

Но когда я создаю и возвращаю Castle DictionaryAdapter напрямую, контроллер все равно просто обнуляется.

Есть идеи, почему WebAPI ненавидит Castle DictionaryAdapter?

0 ответов

Другие вопросы по тегам