c# - 有没有一种方法可以使用 JsonConverter 派生的自定义转换器进行依赖注入(inject)

标签 c# dependency-injection json.net ninject

和这个不太一样:

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

答案是反序列化的数据类无论如何都不需要服务。有没有一种方法可以对派生自 JsonConverter 的类使用依赖注入(inject)?例如,如果你有这个:

[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 做这件事?

编辑 这并不是像建议的欺骗那样将服务注入(inject) Foo。这仅注入(inject)到 MyCustomConverter 中,以便它可以反序列化 Foo

最佳答案

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

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

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

然后在转换器中:

var jsonContract = serializer.ContractResolver.ResolveContract(typeof(IMyService));
var service = (IMyService)jsonContract.DefaultCreator();

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

关于c# - 有没有一种方法可以使用 JsonConverter 派生的自定义转换器进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31927711/

相关文章:

c# - 如何反序列化此 JSON?

c# - 检查和检索集合中第一项的最佳方法是什么?

c# - 如何避免在 openTK 中使用动态文本耗尽内存

c# - 具有自定义数据类型的 JSON.NET 转换类

c# - 使用 CaSTLe Windsor 将依赖项注入(inject) CustomAttribute

c# - 为什么 WindsorDependencyResolver 无法解析?

c# - WebAPI 返回没有根节点的 JSON 数组

c# - Razor 页面 - 在单击包含在表单中的按钮时使用 "action"标记重定向到 url 时出现 400 错误

c# - 如何用 C# 打开第二个窗口选择菜单(Start+P)?

Scala IO 单子(monad) : what's the point?