6

のカスタム実装を行おうとしていますMediaTypeFormatterが、メソッドbool CanReadType(Type type)は常にIKeyValueModelmy 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: このオブジェクトにパラメーターなしのコンストラクターが定義されていません」というメッセージが表示されます。これは、モデル タイプにパラメーターなしのコンストラクターがないためです。CanReadTypeに false を返すためIKeyValueModel、フレームワークは別のメディア タイプ フォーマッタを使用しているようです。実際、メソッドOnReadFromStreamAsyncがヒットすることはありません。

モデルがどのように逆シリアル化されるかを制御できるようにしたい、実際の型を取得したいが、IKeyValueModel.

これは、モデル バインダーを使用する MVC で既にうまく機能していました。

乾杯。

更新 2012/05/29:

デフォルトのjsonフォーマッタを削除すると動作します:

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

しかし、両方を保持したいのですが、どちらを使用したいかをどのように指定できますか?

よろしく。

4

1 に答える 1

3

シリアル化を制御する必要がある場合は、そのためだけにメディアタイプフォーマッターを作成するのではなく、Json.NETの柔軟性機能(ここここ、およびここを参照)を使用して制御することをお勧めします。

Json.NETは、 ASP.NETWebAPIのデフォルトのフォーマッターになりました。


アップデート

私のオブジェクトにはパラメーターのないコンストラクターがなく、プロパティは読み取り専用です。DynamicObjectから継承するオブジェクトもあるので、私のビジネスエンティティは簡単ではないとしましょう。

私はおそらくあなた自身を足で撃つ方法をあなたに示すことができます。ただし、アプローチにはアンチパターンがあるため、これらの問題が発生していると思われるため、これらの問題を回避する方法を説明したいと思います。

まず第一に、あなたが探しているのは別のメディアタイプフォーマッターではありません。別のシリアライザーが必要であるか、シリアライザーを構成する必要があります。

しかし、もっと重要なことは、ビジネスエンティティをクライアントに直接シリアル化することはそれほど素晴らしいアイデアではありません。ここではビューモデルと呼ばれるDTOが必要です。そのようなクラスは州の所有者にすぎず、論理も魔法もありません。それらをシリアル化することは問題ではないはずです。

AutoMapperなどを使用して、開発コストをかけずにエンティティをマップしてモデルを表示できます。ドメインモデルをプレゼンテーション層から抽象化することを常にお勧めします。

于 2012-05-29T10:39:17.393 に答える