【发布时间】:2016-12-05 20:39:41
【问题描述】:
我正在使用自定义 JsonConverter 来转换我的 JSON 对象。这是通过下面的 IQuery 对象的 JsonConverter 属性实现的
[JsonConverter(typeof(CustomConverter<IQuery>))]
public interface IQuery
{
}
自定义泛型类如下(为简洁起见删除了一些位)
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);
}
}
ICustomObjectConverter 接口很简单
public interface ICustomObjectCreator<out T>
{
T Create(string type);
}
及其实现之一
public class QueryObjectCreator : ICustomObjectCreator<IQuery>
{
public IQuery Create(string type)
{
// ... some logic to create a concrete object
return (IQuery)concreteObject;
}
}
最后,Autofac 符合上述要求
builder.RegisterType<QueryObjectCreator>()
.As<ICustomObjectCreator<IQuery>>()
.InstancePerLifetimeScope();
问题:
- 调用 CustomJsonConverter 时,仅调用其默认构造函数。 JsonConstructor 永远不会被调用。
- 如果我删除默认构造函数,则永远不会调用整个 JsonConverter!
我有一个提示,即在调用 JsonConverter 时永远不会调用 AutoFac。我什至尝试过属性注入来显式构造 QueryObjectConstruct,但即使这样也从未被调用过。我怎样才能让它工作,以便通过 DI 注入我的 QueryObjectCretor?
我找到了 this 关于依赖注入和 JSON.net 反序列化的文章。但是,这是使用 DeserializeObject() 调用进行手动解析,如果可行,我该如何使其与 JsonConverter 属性一起使用?
谢谢
【问题讨论】:
-
仅供参考,查看其他问题的答案可能会有所帮助:stackoverflow.com/a/40974579/3768871
标签: c# dependency-injection json.net autofac