2017-06-21 12 views
0

httpリクエストのコンテキスト・パスに応じて、異なるシリアライズ・ルールを適用する必要があります。私は、最もクリーンな方法は、私のアプリケーションの起動時にフックされるJsonConverterでこれを行うことだと考えていた。リクエスト・コンテキストごとのJsonSerializer

class MyJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var context = serializer.Context; 
     ... 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var context = serializer.Context; 
     ... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     ... 
    } 
} 
//in the startup i am just registering this converter by 
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings 
      { 
       Converters = new List<JsonConverter>() 
       { 
        new MyJsonConverter() 
       } 
      }; 

問題は、私の期待は、私の要求のコンテキストであることをserializer.Contextを持っていることでした。この点にあります。しかし、実際には空です。

私はこれをコンバーターで使用できるように、リクエストごとに設定する方法を教えてください。 asp.netレベルでこれを行う可能性は何ですか?またはそれを解決するためにオートファックを使用していますか?ご登録にご登録に

答えて

0

まず第一に、あなたはnugetパッケージをインストールすることをお勧めします "Autofac.Integration.Mvc"

、あなたが.InstancePerHttpRequestを(追加することができます) https://autofac.org/apidoc/html/CE22CC19.htm

第二に、あなたはそれを取り出すことができると仮定すると、ラムダは、それぞれのHttpRequestを実行し、あなたの現在のコンテキストを提供します。この

builder.Register(c => new JsonSerializer(config.Formatters.JsonFormatter.SerializerSettings)).InstancePerHttpRequest().As<JsonSerializer>(); 

のようなものがあるでしょう。

各メソッドではなく、コンストラクタでJsonSerializerを使用するようにコードを変更する必要があります。これにより、autofacが起動され、HttpRequestごとに新しいインスタンスが生成されます。あなたのコードは次のようになります...

class MyJsonConverter : JsonConverter 
{ 
    private readonly JsonSerializer _serializer; 
    public MyJsonConverter(JsonSerializer serializer) 
    { 
     _serializer = serializer; 
    } 

    public override void WriteJson(JsonWriter writer, object value) 
    { 
     var context = _serializer.Context; 
     ... 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue) 
    { 
     var context = _serializer.Context; 
     ... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     ... 
    } 
} 
+0

@rateus、あなたの答えに感謝します。私は1つのことではっきりしていません。シリアライズ設定のインスタンスを実際に保持している 'SerializerSettings'がスタートアップコンフィギュレーションで行われるので、インスタンスは1つだけです。コンバーターで使用される 'JsonSerializer.Context'でリクエストごとのコンテキストを解決する方法だったと思っていました。 – Kanekotic

+0

@Kanekotic私はあなたが必要と思うものに私の答えを更新しました。私は最初にNewtonSoft Json – raterus

関連する問題