Skip to content
This repository was archived by the owner on Nov 11, 2025. It is now read-only.

Commit 21429a0

Browse files
author
Mike Blair
committed
Add FractalDataWorks.EnumTypes.Services with generic base class for service factories
1 parent 4537b45 commit 21429a0

8 files changed

Lines changed: 441 additions & 1 deletion

File tree

FractalDataWorks.EnumTypes.sln

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,145 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{11111111-222
1111
EndProject
1212
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{22222222-3333-4444-5555-666666666666}"
1313
EndProject
14-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{33333333-4444-5555-6666-777777777777}"
14+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FractalDataWorks.EnumTypes.Services", "src\FractalDataWorks.EnumTypes.Services\FractalDataWorks.EnumTypes.Services.csproj", "{255C4107-9DCD-4602-9CB6-CA2258496FD3}"
1515
EndProject
1616
Global
1717
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1818
Debug|Any CPU = Debug|Any CPU
19+
Debug|x64 = Debug|x64
20+
Debug|x86 = Debug|x86
1921
Release|Any CPU = Release|Any CPU
22+
Release|x64 = Release|x64
23+
Release|x86 = Release|x86
2024
Experimental|Any CPU = Experimental|Any CPU
25+
Experimental|x64 = Experimental|x64
26+
Experimental|x86 = Experimental|x86
2127
Alpha|Any CPU = Alpha|Any CPU
28+
Alpha|x64 = Alpha|x64
29+
Alpha|x86 = Alpha|x86
2230
Beta|Any CPU = Beta|Any CPU
31+
Beta|x64 = Beta|x64
32+
Beta|x86 = Beta|x86
2333
Preview|Any CPU = Preview|Any CPU
34+
Preview|x64 = Preview|x64
35+
Preview|x86 = Preview|x86
2436
EndGlobalSection
2537
GlobalSection(ProjectConfigurationPlatforms) = postSolution
2638
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
2739
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|Any CPU.Build.0 = Debug|Any CPU
40+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|x64.ActiveCfg = Debug|Any CPU
41+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|x64.Build.0 = Debug|Any CPU
42+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|x86.ActiveCfg = Debug|Any CPU
43+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Debug|x86.Build.0 = Debug|Any CPU
2844
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|Any CPU.ActiveCfg = Release|Any CPU
2945
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|Any CPU.Build.0 = Release|Any CPU
46+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|x64.ActiveCfg = Release|Any CPU
47+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|x64.Build.0 = Release|Any CPU
48+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|x86.ActiveCfg = Release|Any CPU
49+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Release|x86.Build.0 = Release|Any CPU
3050
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|Any CPU.ActiveCfg = Experimental|Any CPU
3151
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|Any CPU.Build.0 = Experimental|Any CPU
52+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|x64.ActiveCfg = Experimental|Any CPU
53+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|x64.Build.0 = Experimental|Any CPU
54+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|x86.ActiveCfg = Experimental|Any CPU
55+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Experimental|x86.Build.0 = Experimental|Any CPU
3256
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|Any CPU.ActiveCfg = Alpha|Any CPU
3357
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|Any CPU.Build.0 = Alpha|Any CPU
58+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|x64.ActiveCfg = Alpha|Any CPU
59+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|x64.Build.0 = Alpha|Any CPU
60+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|x86.ActiveCfg = Alpha|Any CPU
61+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Alpha|x86.Build.0 = Alpha|Any CPU
3462
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|Any CPU.ActiveCfg = Beta|Any CPU
3563
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|Any CPU.Build.0 = Beta|Any CPU
64+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|x64.ActiveCfg = Beta|Any CPU
65+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|x64.Build.0 = Beta|Any CPU
66+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|x86.ActiveCfg = Beta|Any CPU
67+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Beta|x86.Build.0 = Beta|Any CPU
3668
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|Any CPU.ActiveCfg = Preview|Any CPU
3769
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|Any CPU.Build.0 = Preview|Any CPU
70+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|x64.ActiveCfg = Preview|Any CPU
71+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|x64.Build.0 = Preview|Any CPU
72+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|x86.ActiveCfg = Preview|Any CPU
73+
{27EBD390-A4B4-4410-8FF7-4F97D4117F98}.Preview|x86.Build.0 = Preview|Any CPU
3874
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3975
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
76+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|x64.ActiveCfg = Debug|Any CPU
77+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|x64.Build.0 = Debug|Any CPU
78+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|x86.ActiveCfg = Debug|Any CPU
79+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Debug|x86.Build.0 = Debug|Any CPU
4080
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
4181
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|Any CPU.Build.0 = Release|Any CPU
82+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|x64.ActiveCfg = Release|Any CPU
83+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|x64.Build.0 = Release|Any CPU
84+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|x86.ActiveCfg = Release|Any CPU
85+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Release|x86.Build.0 = Release|Any CPU
4286
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|Any CPU.ActiveCfg = Experimental|Any CPU
4387
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|Any CPU.Build.0 = Experimental|Any CPU
88+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|x64.ActiveCfg = Experimental|Any CPU
89+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|x64.Build.0 = Experimental|Any CPU
90+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|x86.ActiveCfg = Experimental|Any CPU
91+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Experimental|x86.Build.0 = Experimental|Any CPU
4492
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|Any CPU.ActiveCfg = Alpha|Any CPU
4593
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|Any CPU.Build.0 = Alpha|Any CPU
94+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|x64.ActiveCfg = Alpha|Any CPU
95+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|x64.Build.0 = Alpha|Any CPU
96+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|x86.ActiveCfg = Alpha|Any CPU
97+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Alpha|x86.Build.0 = Alpha|Any CPU
4698
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|Any CPU.ActiveCfg = Beta|Any CPU
4799
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|Any CPU.Build.0 = Beta|Any CPU
100+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|x64.ActiveCfg = Beta|Any CPU
101+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|x64.Build.0 = Beta|Any CPU
102+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|x86.ActiveCfg = Beta|Any CPU
103+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Beta|x86.Build.0 = Beta|Any CPU
48104
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|Any CPU.ActiveCfg = Preview|Any CPU
49105
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|Any CPU.Build.0 = Preview|Any CPU
106+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|x64.ActiveCfg = Preview|Any CPU
107+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|x64.Build.0 = Preview|Any CPU
108+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|x86.ActiveCfg = Preview|Any CPU
109+
{5FB3F6D5-086B-4825-8F45-C90A792756A8}.Preview|x86.Build.0 = Preview|Any CPU
110+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
111+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
112+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|x64.ActiveCfg = Debug|Any CPU
113+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|x64.Build.0 = Debug|Any CPU
114+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|x86.ActiveCfg = Debug|Any CPU
115+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Debug|x86.Build.0 = Debug|Any CPU
116+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
117+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|Any CPU.Build.0 = Release|Any CPU
118+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|x64.ActiveCfg = Release|Any CPU
119+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|x64.Build.0 = Release|Any CPU
120+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|x86.ActiveCfg = Release|Any CPU
121+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Release|x86.Build.0 = Release|Any CPU
122+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|Any CPU.ActiveCfg = Experimental|Any CPU
123+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|Any CPU.Build.0 = Experimental|Any CPU
124+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|x64.ActiveCfg = Experimental|Any CPU
125+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|x64.Build.0 = Experimental|Any CPU
126+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|x86.ActiveCfg = Experimental|Any CPU
127+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Experimental|x86.Build.0 = Experimental|Any CPU
128+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|Any CPU.ActiveCfg = Alpha|Any CPU
129+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|Any CPU.Build.0 = Alpha|Any CPU
130+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|x64.ActiveCfg = Alpha|Any CPU
131+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|x64.Build.0 = Alpha|Any CPU
132+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|x86.ActiveCfg = Alpha|Any CPU
133+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Alpha|x86.Build.0 = Alpha|Any CPU
134+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|Any CPU.ActiveCfg = Beta|Any CPU
135+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|Any CPU.Build.0 = Beta|Any CPU
136+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|x64.ActiveCfg = Beta|Any CPU
137+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|x64.Build.0 = Beta|Any CPU
138+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|x86.ActiveCfg = Beta|Any CPU
139+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Beta|x86.Build.0 = Beta|Any CPU
140+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|Any CPU.ActiveCfg = Preview|Any CPU
141+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|Any CPU.Build.0 = Preview|Any CPU
142+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|x64.ActiveCfg = Preview|Any CPU
143+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|x64.Build.0 = Preview|Any CPU
144+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|x86.ActiveCfg = Preview|Any CPU
145+
{255C4107-9DCD-4602-9CB6-CA2258496FD3}.Preview|x86.Build.0 = Preview|Any CPU
50146
EndGlobalSection
51147
GlobalSection(SolutionProperties) = preSolution
52148
HideSolutionNode = FALSE
53149
EndGlobalSection
54150
GlobalSection(NestedProjects) = preSolution
55151
{27EBD390-A4B4-4410-8FF7-4F97D4117F98} = {11111111-2222-3333-4444-555555555555}
56152
{5FB3F6D5-086B-4825-8F45-C90A792756A8} = {22222222-3333-4444-5555-666666666666}
153+
{255C4107-9DCD-4602-9CB6-CA2258496FD3} = {11111111-2222-3333-4444-555555555555}
57154
EndGlobalSection
58155
EndGlobal
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
3+
namespace FractalDataWorks.EnumTypes.Services.Attributes;
4+
5+
/// <summary>
6+
/// Marks a service type collection for automatic DI registration generation.
7+
/// </summary>
8+
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
9+
public sealed class ServiceTypeRegistrationAttribute : Attribute
10+
{
11+
/// <summary>
12+
/// Gets or sets whether to generate an initialization method.
13+
/// </summary>
14+
public bool GenerateInitialization { get; set; } = true;
15+
16+
/// <summary>
17+
/// Gets or sets the name of the extension method.
18+
/// If not specified, will use "Add{CollectionName}".
19+
/// </summary>
20+
public string? ExtensionMethodName { get; set; }
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<LangVersion>12.0</LangVersion>
6+
<Nullable>enable</Nullable>
7+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
8+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="FractalDataWorks.EnhancedEnums" />
13+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" PrivateAssets="all" />
14+
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" PrivateAssets="all" />
15+
</ItemGroup>
16+
17+
18+
</Project>
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.CSharp;
7+
using Microsoft.CodeAnalysis.CSharp.Syntax;
8+
using Microsoft.CodeAnalysis.Text;
9+
10+
namespace FractalDataWorks.EnumTypes.Services.Generators;
11+
12+
/// <summary>
13+
/// Generates DI registration extension methods for service type collections.
14+
/// </summary>
15+
[Generator]
16+
public class ServiceTypeRegistrationGenerator : IIncrementalGenerator
17+
{
18+
/// <inheritdoc/>
19+
public void Initialize(IncrementalGeneratorInitializationContext context)
20+
{
21+
// Find all classes that might be generated enhanced enum collections
22+
var provider = context.SyntaxProvider
23+
.CreateSyntaxProvider(
24+
predicate: (node, _) => node is ClassDeclarationSyntax classDecl &&
25+
classDecl.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword)),
26+
transform: (ctx, _) => GetServiceTypeInfo(ctx))
27+
.Where(info => info != null);
28+
29+
context.RegisterSourceOutput(provider.Collect(),
30+
(ctx, infos) => GenerateRegistrations(ctx, infos));
31+
}
32+
33+
private ServiceTypeInfo? GetServiceTypeInfo(GeneratorSyntaxContext context)
34+
{
35+
var classDecl = (ClassDeclarationSyntax)context.Node;
36+
var symbol = context.SemanticModel.GetDeclaredSymbol(classDecl);
37+
38+
if (symbol == null) return null;
39+
40+
// Check if this is a generated enhanced enum collection
41+
// Look for static properties that return types implementing IServiceFactory
42+
foreach (var member in symbol.GetMembers().OfType<IPropertySymbol>())
43+
{
44+
if (member.IsStatic && member.Type is INamedTypeSymbol propertyType)
45+
{
46+
if (ImplementsIServiceFactory(propertyType))
47+
{
48+
return new ServiceTypeInfo
49+
{
50+
CollectionClassName = symbol.Name,
51+
Namespace = symbol.ContainingNamespace.ToDisplayString(),
52+
ServiceTypes = GetServiceTypes(symbol)
53+
};
54+
}
55+
}
56+
}
57+
58+
return null;
59+
}
60+
61+
private bool ImplementsIServiceFactory(ITypeSymbol type)
62+
{
63+
return type.AllInterfaces.Any(i =>
64+
i.Name == "IServiceFactory" &&
65+
i.ContainingNamespace.ToDisplayString().StartsWith("FractalDataWorks"));
66+
}
67+
68+
private List<ServiceTypePropertyInfo> GetServiceTypes(INamedTypeSymbol collectionSymbol)
69+
{
70+
var result = new List<ServiceTypePropertyInfo>();
71+
72+
foreach (var member in collectionSymbol.GetMembers().OfType<IPropertySymbol>())
73+
{
74+
if (member.IsStatic && !member.Name.Equals("All", StringComparison.Ordinal))
75+
{
76+
result.Add(new ServiceTypePropertyInfo
77+
{
78+
PropertyName = member.Name,
79+
TypeName = member.Type.ToDisplayString()
80+
});
81+
}
82+
}
83+
84+
return result;
85+
}
86+
87+
private void GenerateRegistrations(SourceProductionContext context, IEnumerable<ServiceTypeInfo?> infos)
88+
{
89+
foreach (var info in infos.Where(i => i != null))
90+
{
91+
var source = GenerateRegistrationExtensions(info!);
92+
context.AddSource($"{info!.CollectionClassName}Extensions.g.cs",
93+
SourceText.From(source, Encoding.UTF8));
94+
}
95+
}
96+
97+
private string GenerateRegistrationExtensions(ServiceTypeInfo info)
98+
{
99+
var sb = new StringBuilder();
100+
101+
sb.AppendLine("using System;");
102+
sb.AppendLine("using Microsoft.Extensions.DependencyInjection;");
103+
sb.AppendLine();
104+
sb.AppendLine($"namespace {info.Namespace};");
105+
sb.AppendLine();
106+
sb.AppendLine("/// <summary>");
107+
sb.AppendLine($"/// Extension methods for registering {info.CollectionClassName}.");
108+
sb.AppendLine("/// </summary>");
109+
sb.AppendLine($"public static class {info.CollectionClassName}Extensions");
110+
sb.AppendLine("{");
111+
112+
// Generate Add method
113+
sb.AppendLine($" /// <summary>");
114+
sb.AppendLine($" /// Registers all service type factories from {info.CollectionClassName}.");
115+
sb.AppendLine($" /// </summary>");
116+
sb.AppendLine($" public static IServiceCollection Add{info.CollectionClassName}(this IServiceCollection services)");
117+
sb.AppendLine(" {");
118+
119+
foreach (var serviceType in info.ServiceTypes)
120+
{
121+
sb.AppendLine($" services.AddSingleton<{serviceType.TypeName}>();");
122+
}
123+
124+
sb.AppendLine();
125+
sb.AppendLine(" return services;");
126+
sb.AppendLine(" }");
127+
sb.AppendLine("}");
128+
129+
return sb.ToString();
130+
}
131+
}
132+
133+
internal class ServiceTypeInfo
134+
{
135+
public string CollectionClassName { get; set; } = "";
136+
public string Namespace { get; set; } = "";
137+
public List<ServiceTypePropertyInfo> ServiceTypes { get; set; } = new();
138+
}
139+
140+
internal class ServiceTypePropertyInfo
141+
{
142+
public string PropertyName { get; set; } = "";
143+
public string TypeName { get; set; } = "";
144+
}

0 commit comments

Comments
 (0)