是否有任何约定或内置概念如何注入Json序列化器?

时间:2019-05-20 07:45:01

标签: asp.net-core dependency-injection json.net

上下文

在我的一些ASP.NET项目类中,对JSON进行序列化/反序列化 我想使用静态JsonConvert...方法不是最好的选择,也不使用带有硬编码类的new

问题

我会在构造函数中注入一些东西吗?为此,我是否必须定义我的自定义简单接口,还是有任何约定/内置的概念如何不对类型进行硬编码?

3 个答案:

答案 0 :(得分:2)

如果有帮助,ASP.NET Core会在某些地方抽象JSON序列化程序本身。例如,在Razor视图(视图和页面)中,可以使用Json.Serialize()将内容序列化到正文中。这将使用IJsonHelper提供对序列化的抽象访问,同时使用来自序列化器的所有预配置设置(确保一致的输出)。

在2.2中,基础JsonHelper使用JsonOutputFormatter实际提供对串行器的访问。 IJsonHelperJsonOutputFormatter都可以通过依赖项注入获得,因此您可以在需要时将它们注入任何地方。

在3.0中,团队将删除对Newtonsoft.Json的直接依赖,并自行引入适当的抽象。 IJsonHelper仍然存在。默认情况下,Newtonsoft.Json不会出现,因此,如果您依赖它(例如,因为您静态使用它),则必须自己添加一个依赖项(也许也可以切换回ASP.NET Core来使用它)

当您想反序列化时,IJsonHelper将无济于事,并且周围没有组件可以直接访问反序列化器。在这种情况下,您始终可以自己创建一个JsonSerializer。您可以从DI获取串行器设置:

IOptions<MvcJsonOptions> mvcJsonOptions // get through DI

var serializer = JsonSerializer.Create(mvcJsonOptions.Options.SerializerSettings);

它使用框架中全局配置的序列化设置。

通常,仅使用JsonConvert静态也可以。但总的来说,您会尽量避免自己对序列化和反序列化。该框架已经在数据输入或输出的各个地方为您解决了这一问题。因此,根据您的用例,可能已经存在自动在JSON之间进行转换的方法。

答案 1 :(得分:0)

这不是特定于JSON序列化的。与每个静态类一样,您不能对其应用接口(更不用说第三方类了)。例如,请参见Dependency injection with a static logger, static helper class

因此,您需要编写自己的包装器类并将其注入:

public interface IJsonSerializer
{
    string SerializeObject(object o);
    T DeserializeObject<T>(string json);
}

public class NewtonsoftJsonSerializer : IJsonSerializer
{
    public string SerializeObject(object o)
    {
        return Newtonsoft.Json.JsonConvert.SerializeObject(o);
    }

    public T DeserializeObject<T>(string json)
    {
        return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
    }
}

答案 2 :(得分:0)

就我个人而言,我对抽象服务(例如JSON序列化程序)的使用不会感到烦恼。并非所有的静态方法都是错误的,也不是必须在服务中将所有内容抽象化,除非非常期望您要交换实现或创建用于测试的模拟。否则,我建议您专注于应用程序的业务逻辑,仅在必要时才创建抽象,并为应用程序的设计和可测试性提供价值。