如何在.NET Core 3.1服务类中注入配置好的JsonConvert?
在.NET Core 3.1服务类中复用Newtonsoft.Json序列化配置
你当前每次调用LogEvent都创建新的JsonSerializerSettings和StringEnumConverter,虽然单次调用影响不大,但高频场景下会产生不必要的临时对象,增加GC负担,确实有优化空间。可以通过两种方式实现全局配置或复用配置,不用每次重复创建:
方式一:全局设置JsonConvert默认配置
直接在Startup.cs的ConfigureServices中配置JsonConvert.DefaultSettings,这样所有JsonConvert.SerializeObject的调用都会自动使用这个全局配置:
public void ConfigureServices(IServiceCollection services) { // 其他服务注册代码... // 全局配置Newtonsoft.Json序列化规则 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new Newtonsoft.Json.Converters.StringEnumConverter() }, NullValueHandling = NullValueHandling.Ignore }; }
之后你的服务类代码可以简化回最初的写法,无需手动传配置:
private void LogEvent(object properties, LogLevel logLevel) { var message = JsonConvert.SerializeObject(properties); _logger.Log(logLevel, message); }
方式二:将配置好的JsonSerializerSettings注册为单例服务
如果更倾向于依赖注入的模式(方便单元测试替换配置),可以把配置好的JsonSerializerSettings注册为单例,注入到服务类中使用:
1. 在Startup中注册服务
public void ConfigureServices(IServiceCollection services) { // 其他服务注册代码... // 注册序列化配置为单例 services.AddSingleton<JsonSerializerSettings>(sp => new JsonSerializerSettings { Converters = { new Newtonsoft.Json.Converters.StringEnumConverter() }, NullValueHandling = NullValueHandling.Ignore }); }
2. 在服务类中注入并使用
private readonly ILogger _logger; private readonly JsonSerializerSettings _jsonSettings; // 通过构造函数注入配置 public YourService(ILogger<YourService> logger, JsonSerializerSettings jsonSettings) { _logger = logger; _jsonSettings = jsonSettings; } private void LogEvent(object properties, LogLevel logLevel) { var message = JsonConvert.SerializeObject(properties, Formatting.None, _jsonSettings); _logger.Log(logLevel, message); }
注意事项
你提到的AddJsonOptions是用来配置.NET Core MVC框架处理HTTP请求/响应时的序列化规则,和JsonConvert静态方法的序列化逻辑不共享,所以不能直接用它来配置服务类中的JsonConvert调用。
内容的提问来源于stack exchange,提问作者winterishere
相关产品推荐
相关产品推荐

