使用WebAPI,如何使用CustomCreationConverter返回Castle DictionaryAdapter以进行接口参数绑定?

时间:2013-01-18 19:10:34

标签: c# json wcf asp.net-web-api castle-dictionaryadapter

我正在使用Json.NET序列化程序使用Microsoft WebAPI,我正在尝试使用控制器参数绑定来实例化Castle DictionaryAdapter作为JSON中的反序列化对象。 (这将允许我们检测JSON中是否将某些属性设置为null,或者它们是否默认为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的模型创建并返回Castle代理。但是,调用控制器时,model参数为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 个答案:

没有答案