2017-06-21 33 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級別做到這一點?或者可能使用autofac來解決它?

回答

0

首先,你要的NuGet包 「Autofac.Integration.Mvc」

那麼你可以添加.InstancePerHttpRequest()安裝到您的註冊 https://autofac.org/apidoc/html/CE22CC19.htm

其次,在你註冊,你會有這樣的東西

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

lamda將執行每個HttpRequest並給你當前的上下文,假設你可以檢索它。

您需要修改代碼以在構造函數中使用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,謝謝你的回答。我不清楚一件事。與SerializerSettings實際上一樣,Serialising設置的實例在啓動配置時完成,因此只有一個實例。我正在考慮是否在轉換器中使用'JsonSerializer.Context'來解決每個請求的上下文。 – Kanekotic

+0

@Kanekotic我已經更新了我的答案,我認爲你需要,我一開始並不知道你使用的是NewtonSoft Json – raterus

相關問題