每个请求上下文的JsonSerializer

时间:2017-06-21 14:54:13

标签: c# asp.net json.net autofac

我必须根据http请求中的上下文传递应用不同的序列化规则。我认为最干净的方法是使用JsonConverter来完成这个操作,它将从我的应用程序的启动中挂钩。

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来解决它?

1 个答案:

答案 0 :(得分:1)

首先,您要安装nuget软件包&#34; Autofac.Integration.Mvc&#34;

然后您可以将.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)
    {
        ...
    }
}