我正在使用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?