2017-06-21 138 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