【问题标题】:Custom MediaTypeFormatter, why IKeyValueModel and not my model type?自定义 MediaTypeFormatter,为什么是 IKeyValueModel 而不是我的模型类型?
【发布时间】:2012-05-28 11:51:11
【问题描述】:

我正在尝试自定义实现 MediaTypeFormatter,但始终使用类型 IKeyValueModel 调用方法 bool CanReadType(Type type),而不是我的类型 MyProduct

在我的 API 控制器中,我有:

[HttpPost]
public Task Save(MyProduct product)

我看过一些例子(example 1example 2),我也试过代码:

protected override bool CanReadType(Type type)
{
    if (type == typeof(IKeyValueModel))
        return false;
      return true;
}

然后我得到一个“MissingMethodException:没有为此对象定义无参数构造函数”,因为我的模型类型没有无参数构造函数。所以看起来因为CanReadTypeIKeyValueModel 返回false,框架使用了另一个媒体类型格式化程序。实际上,方法OnReadFromStreamAsync 永远不会被命中。

我希望能够控制我的模型如何反序列化,我想获得真实类型而不是IKeyValueModel

这在带有模型绑定器的 MVC 中已经很有效了。

干杯。

2012 年 5 月 29 日更新:

如果我删除默认的 json 格式化程序,它会起作用:

    public static void RegisterApis(HttpConfiguration config)
    {
        config.Formatters.Clear();

但是我想保留两者,我怎么能指出我想使用哪一个?

问候。

【问题讨论】:

  • 为什么需要自定义MediaTypeFormatter
  • 尝试最新代码(夜间构建),当前源中没有 IKeyValueModel。它已被团队删除/删除。 aspnetwebstack.codeplex.com/SourceControl/network/forks/…
  • @Aliostad 我需要一个自定义 MediaTypeFormatter 来控制我的对象如何序列化和反序列化为 JSON。
  • @user960567 所以我们可以期待版本中的重大变化?
  • @NullOrEmpty,henrik 一直在帮助我们,blogs.msdn.com/b/henrikn

标签: asp.net-mvc-4 asp.net-web-api mediatypeformatter


【解决方案1】:

如果您需要控制序列化,最好使用 Json.NET 的灵活性功能(参见hereherehere)来控制而不是为此编写媒体类型格式化程序。

Json.NET now 是 ASP.NET Web API 中的默认格式化程序。


更新

我的对象没有无参数构造函数和属性 是只读的。我也有继承自 DynamicObject 的对象,所以 假设我的业务实体并非微不足道。

我可能会告诉你如何在脚上开枪。但我更愿意解释如何避免出现这些问题,因为我相信你会遇到这些问题,因为你的方法中有反模式。

首先,您要寻找的不是另一种媒体类型格式化程序。您需要不同的序列化程序,或者只需要配置您的序列化程序。

但更重要的是,将您的业务实体直接序列化给客户端并不是一个好主意。我们需要在这里称为视图模型的 DTO。这样的类只是状态持有者,没有逻辑,没有魔法。序列化它们应该没有问题。

您可以使用 AutoMapper 等将您的实体映射到视图模型,而无需更多开发成本。 始终建议从表示层抽象出您的领域模型。

【讨论】:

  • 我的对象没有无参数构造函数并且属性是只读的。我也有继承自 DynamicObject 的对象,所以假设我的业务实体并非微不足道。我实际上在后台使用 JSON.NET,但我需要以自定义方式使用它。
  • 感谢您的意见,但问题是关于其他的。当我们创建 JSON 实体时,我们实际上是在创建 DTO,这就是 JSON 的重点 :) 所以,我需要一种方法来控制这些 JSON DTO 如何在我的业务实体中/从我的业务实体中转换......正如我已经说过的,我的业务对象是动态(System.Dynamic),这不是要序列化一个具有所有属性的对象,而是要从我的动态业务对象创建一个 JSON 传输对象,反之亦然。
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多