В 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?