Atributo JsonConverter: desserialize usando o construtor personalizado e o Autofac
Estou usando um JsonConverter personalizado para converter meu objeto JSON. Isso é obtido através do atributo JsonConverter no objeto IQuery abaixo
[JsonConverter(typeof(CustomConverter<IQuery>))]
public interface IQuery
{
}
A classe genérica personalizada está abaixo (alguns bits foram removidos por questões de brevidade)
public class CustomConverter<T> : JsonConverter
{
// This should be created via AutoFac
public ICustomObjectCreator<T> ObjectCreator { get; set; }
// This default constructr always gets called
public CustomConverter() {}
// I want to call this constructor
[JsonConstructor]
public CustomConverter(ICustomObjectCreator<T> objectCreator)
{
Context = context;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
// Load JObject from stream
var jObject = JObject.Load(reader);
// Create target object based on JObject
var target = Create(objectType, jObject);
// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);
return target;
}
protected T Create(Type objectType, JObject jObject)
{
var type = jObject.GetValue("type", StringComparison.OrdinalIgnoreCase)?.Value<string>();
return ObjectCreator.Create(type);
}
}
A interface ICustomObjectConverter é simples
public interface ICustomObjectCreator<out T>
{
T Create(string type);
}
e uma de sua implementação
public class QueryObjectCreator : ICustomObjectCreator<IQuery>
{
public IQuery Create(string type)
{
// ... some logic to create a concrete object
return (IQuery)concreteObject;
}
}
Por fim, o Autofac está conectado para honrar os
builder.RegisterType<QueryObjectCreator>()
.As<ICustomObjectCreator<IQuery>>()
.InstancePerLifetimeScope();
Problemas:
Quando CustomJsonConverter é chamado, apenas seu construtor padrão é chamado. O JsonConstructor NUNCA é chamado.Se eu remover o construtor padrão, o JsonConverter inteiro nunca será chamado!Eu tenho um inklinkg que o AutoFac nunca está sendo chamado quando o JsonConverter está sendo chamado. Eu até tentei injeção de propriedade para construir QueryObjectConstruct explicitamente, mas mesmo isso nunca é chamado. Como posso fazê-lo funcionar para que meu QueryObjectCretor seja injetado via DI?
eu encontreiesta artigo sobre Injeção de dependência e desserialização JSON.net. No entanto, isso é para resolução manual usando a chamada DeserializeObject <> (), como posso, se funcionar, fazê-lo funcionar com o atributo JsonConverter?
obrigado