有没有办法通过JsonConverter派生自定义转换器获取依赖注入

时间:2015-08-10 19:36:51

标签: c# dependency-injection json.net ninject

与此不完全相同:

How do I Inject Dependencies with Ninject, where instances are deserialised from json

答案是,您反序列化的数据类无论如何都不需要服务。有没有办法使用依赖注入与从JsonConverter派生的类?例如,如果你有这个:

[JsonConverter(typeof(MyCustomConverter))]
public class Foo
{
    public string SomeProp { get; set; }
}

public class MyCustomConverter : JsonConverter
{
    private readonly IMyService myService;

    public MyCustomConverter(IMyService _myService)
    {
        myService = _myService;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var bar = myService.SomeFunctionThatMightEffectDeserialization();
        //...
    }
}

无论如何都要挂钩JSON.Net如何实例化MyCustomConverter让它让Ninject做它的事情?

编辑这不会像建议的欺骗一样将服务注入Foo。这只是注入MyCustomConverter,以便它可以反序列化Foo

1 个答案:

答案 0 :(得分:1)

这有点像黑客,但可以通过在JsonSerializerSettings中设置ContractResolver来做类似的事情。在这种情况下,使用Autofac:

Column

然后在转换器中:

var builder = new ContainerBuilder();
builder.RegisterInstance(myService);
var container = builder.Build();

var settings = new JsonSerializerSettings
{
    ContractResolver = new AutofacContractResolver(container),
};

所以你并没有真正将服务注入到转换器中,但至少你可以在没有具体依赖的情况下访问它。此外,您不是使用与应用程序相同的Autofac容器,而是创建一个新容器。不理想,但它是:)