c# - 是否有任何约定或内置概念如何注入(inject) Json 序列化程序?

标签 c# asp.net-core dependency-injection json.net

上下文

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

问题

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

最佳答案

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

在 2.2 中,底层 JsonHelper使用 JsonOutputFormatter 实际提供对序列化程序的访问。 IJsonHelperJsonOutputFormatter可以通过依赖注入(inject)获得,因此您可以在需要时将它们注入(inject)任何地方。

在 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 之间进行转换。

关于c# - 是否有任何约定或内置概念如何注入(inject) Json 序列化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56216384/

相关文章:

c# - 用 3 位数字分隔长号

c# - ASP.NET Core 路由前缀

c# - 使用 Microsoft Asp.NET 依赖注入(inject)时找不到 HttpActionContext.get_Request() 方法

docker - 如何运行 VS 2017 生成的 docker 镜像

c# - 系统.InvalidOperationException : Unable to resolve service for type

c# - 如何使用 Unity 映射泛型类型?

c# - 手动解析 InstancePerRequest 类型时未收到 Autofac 相同的注入(inject)实例

c# - 获取所有方法调用

c# - 为什么控件上的某些属性具有更高的优先级

c# - 将匿名泛型类型与多个泛型一起使用