我必须根据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来解决它?
答案 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)
{
...
}
}