8

新しいASP.NETwebapiodataを使用しています(バージョン4.0.0はNugetによると2013年2月27日に最後に公開されました)

基本的に私はここで説明されているようにそれをやっています:http ://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

データ転送オブジェクトを公開していて、odata atom pubフィードが作成されていますが、それをもう少し制御したいと思います。主に次のことができるようにしたいと思います。

  • フィードのタイトル、作成者、更新された要素の内容を決定します
  • 編集リンクを使用するかどうかを決定します
  • アプリケーションのクラスであるサブプロパティに<category term="X"表示される内容を変更します。m:type現在、完全な名前空間でc#クラス名を公開していますが、これは公開したくありません。

ありがとう。

4

1 に答える 1

11

ODataメディアタイプフォーマッタは、より拡張可能になりました。サンプルは次のとおりです。

1)フィードのタイトル、作成者、更新された要素の内容を決定します

public class AtomMetadataFeedSerializer : ODataFeedSerializer
{
    public AtomMetadataFeedSerializer(IEdmCollectionTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataFeed CreateODataFeed(IEnumerable feedInstance, ODataSerializerContext writeContext)
    {
        ODataFeed feed = base.CreateODataFeed(feedInstance, writeContext);
        feed.Atom().Title = new AtomTextConstruct { Kind = AtomTextConstructKind.Text, Text = "My Awesome Feed" };
        return feed;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsCollection() && edmType.AsCollection().ElementType().IsEntity())
        {
            // feed serializer
            return new AtomMetadataFeedSerializer(edmType.AsCollection(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

そして、を使用してカスタムシリアライザプロバイダーを登録します。

config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create(new CustomSerializerProvider(), new DefaultODataDeserializerProvider()));

2)編集リンクをカスタマイズする

public class CustomEntityTypeSerializer : ODataEntityTypeSerializer
{
    public CustomEntityTypeSerializer(IEdmEntityTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataEntry CreateEntry(EntityInstanceContext entityInstanceContext, ODataSerializerContext writeContext)
    {
        ODataEntry entry = base.CreateEntry(entityInstanceContext, writeContext);
        if (notProduceEditLinks)
        {
            entry.EditLink = null;
        }

        return entry;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsEntity())
        {
            // entity type serializer
            return new CustomEntityTypeSerializer(edmType.AsEntity(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

上記のようにカスタムシリアライザプロバイダーを登録します。

シナリオ3、つまりタイプ名と名前空間のエイリアシングはまだサポートされていません。

于 2013-03-14T02:20:15.713 に答える