Search code examples
dependency-injectionyamldotnet

Can YamlDotNet's IDeserializer be used as a singleton in IServiceCollection?


I'm configuring a YamlDotNet deserializer like this:

static IDeserializer CreateYamlDeserializer()
{
    var deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .WithTypeConverter(new YamlEnumMemberAttributeConverter())
    .IgnoreUnmatchedProperties()
    .Build();
    return deserializer;
}

Then I have 3 different parsers, all requiring the deserializer to be injected via the constructor.

Is it safe to register the deserializer as a singleton, or would each service need its own instance (transient), given the parsers can run in parallel?

services.AddSingleton<IDeserializer>(CreateYamlDeserializer());
// or: services.AddTransient<IDeserializer>(provider => CreateYamlDeserializer());
services.AddSingleton<YamlParserA>();
services.AddSingleton<YamlParserB>();
services.AddSingleton<YamlParserC>();

Solution

  • The Serializer and Deserializer are thread safe and can (and should) be used as singletons.