Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion Coder.Test/ServiceCollectionExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,15 @@ public void AddCoder_ShouldBeIdempotent()
YamlSerializer? serializer = serviceProvider.GetService<YamlSerializer>();
YamlDeserializer? deserializer = serviceProvider.GetService<YamlDeserializer>();

Assert.IsTrue(generators.Count > 0, "Generators should still be registered");
Assert.HasCount(7, generators, "Each generator should be registered once however often AddCoder is called");
foreach (string languageId in new[] { "python", "csharp", "javascript", "cpp", "c", "rust", "go" })
{
ILanguageGenerator generator = generators.Single(g => g.LanguageId == languageId);
Assert.IsNotNull(generator, $"{languageId} should resolve to exactly one generator");
}

Assert.HasCount(1, serviceProvider.GetServices<YamlSerializer>(), "Serializer should be registered once");
Assert.HasCount(1, serviceProvider.GetServices<YamlDeserializer>(), "Deserializer should be registered once");
Assert.IsNotNull(serializer, "Serializer should still be registered");
Assert.IsNotNull(deserializer, "Deserializer should still be registered");
}
Expand Down
22 changes: 12 additions & 10 deletions Coder/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ namespace ktsu.Coder;

using ktsu.Coder.Languages;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

/// <summary>
/// Extension methods for configuring Coder services in dependency injection containers.
Expand All @@ -19,14 +20,15 @@ public static IServiceCollection AddLanguageGenerators(this IServiceCollection s
{
Ensure.NotNull(services);

// Register all available language generators
services.AddSingleton<ILanguageGenerator, PythonGenerator>();
services.AddSingleton<ILanguageGenerator, CSharpGenerator>();
services.AddSingleton<ILanguageGenerator, JavaScriptGenerator>();
services.AddSingleton<ILanguageGenerator, CppGenerator>();
services.AddSingleton<ILanguageGenerator, CGenerator>();
services.AddSingleton<ILanguageGenerator, RustGenerator>();
services.AddSingleton<ILanguageGenerator, GoGenerator>();
// Register all available language generators. TryAddEnumerable skips a generator that is
// already registered, so calling this twice still resolves one of each.
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, PythonGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, CSharpGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, JavaScriptGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, CppGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, CGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, RustGenerator>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ILanguageGenerator, GoGenerator>());

return services;
}
Expand All @@ -40,8 +42,8 @@ public static IServiceCollection AddCoderSerialization(this IServiceCollection s
{
Ensure.NotNull(services);

services.AddSingleton<Serialization.YamlSerializer>();
services.AddSingleton<Serialization.YamlDeserializer>();
services.TryAddSingleton<Serialization.YamlSerializer>();
services.TryAddSingleton<Serialization.YamlDeserializer>();

return services;
}
Expand Down
Loading