ServiceCollectionExtensions.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System.Reflection;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using RackPeek.Domain.Persistence;
  4. using RackPeek.Domain.Resources;
  5. using RackPeek.Domain.Resources.Hardware;
  6. using RackPeek.Domain.Resources.Services;
  7. using RackPeek.Domain.Resources.SystemResources;
  8. using RackPeek.Domain.UseCases;
  9. using RackPeek.Domain.UseCases.Cpus;
  10. using RackPeek.Domain.UseCases.Drives;
  11. using RackPeek.Domain.UseCases.Gpus;
  12. using RackPeek.Domain.UseCases.Nics;
  13. using RackPeek.Domain.UseCases.Labels;
  14. using RackPeek.Domain.UseCases.Ports;
  15. using RackPeek.Domain.UseCases.Tags;
  16. namespace RackPeek.Domain;
  17. public interface IResourceUseCase<T> where T : Resource
  18. {
  19. }
  20. public static class ServiceCollectionExtensions
  21. {
  22. public static IServiceCollection AddResourceUseCases(
  23. this IServiceCollection services,
  24. Assembly assembly)
  25. {
  26. var types = assembly.GetTypes()
  27. .Where(t => !t.IsAbstract && !t.IsInterface);
  28. foreach (var type in types)
  29. {
  30. var resourceUseCaseInterfaces = type.GetInterfaces()
  31. .Where(i =>
  32. i.IsGenericType &&
  33. i.GetInterfaces().Any(parent =>
  34. parent.IsGenericType &&
  35. parent.GetGenericTypeDefinition() == typeof(IResourceUseCase<>)));
  36. foreach (var serviceType in resourceUseCaseInterfaces) services.AddScoped(serviceType, type);
  37. }
  38. return services;
  39. }
  40. public static IServiceCollection AddUseCases(
  41. this IServiceCollection services)
  42. {
  43. services.AddScoped(typeof(IAddResourceUseCase<>), typeof(AddResourceUseCase<>));
  44. services.AddScoped(typeof(IAddLabelUseCase<>), typeof(AddLabelUseCase<>));
  45. services.AddScoped(typeof(IAddTagUseCase<>), typeof(AddTagUseCase<>));
  46. services.AddScoped(typeof(ICloneResourceUseCase<>), typeof(CloneResourceUseCase<>));
  47. services.AddScoped(typeof(IDeleteResourceUseCase<>), typeof(DeleteResourceUseCase<>));
  48. services.AddScoped(typeof(IRemoveLabelUseCase<>), typeof(RemoveLabelUseCase<>));
  49. services.AddScoped(typeof(IRemoveTagUseCase<>), typeof(RemoveTagUseCase<>));
  50. services.AddScoped(typeof(IGetAllResourcesByKindUseCase<>), typeof(GetAllResourcesByKindUseCase<>));
  51. services.AddScoped(typeof(IGetResourceByNameUseCase<>), typeof(GetResourceByNameUseCase<>));
  52. services.AddScoped(typeof(IRenameResourceUseCase<>), typeof(RenameResourceUseCase<>));
  53. services.AddScoped(typeof(IAddCpuUseCase<>), typeof(AddCpuUseCase<>));
  54. services.AddScoped(typeof(IRemoveCpuUseCase<>), typeof(RemoveCpuUseCase<>));
  55. services.AddScoped(typeof(IUpdateCpuUseCase<>), typeof(UpdateCpuUseCase<>));
  56. services.AddScoped(typeof(IAddDriveUseCase<>), typeof(AddDriveUseCase<>));
  57. services.AddScoped(typeof(IRemoveDriveUseCase<>), typeof(RemoveDriveUseCase<>));
  58. services.AddScoped(typeof(IUpdateDriveUseCase<>), typeof(UpdateDriveUseCase<>));
  59. services.AddScoped(typeof(IAddGpuUseCase<>), typeof(AddGpuUseCase<>));
  60. services.AddScoped(typeof(IRemoveGpuUseCase<>), typeof(RemoveGpuUseCase<>));
  61. services.AddScoped(typeof(IUpdateGpuUseCase<>), typeof(UpdateGpuUseCase<>));
  62. services.AddScoped(typeof(IAddPortUseCase<>), typeof(AddPortUseCase<>));
  63. services.AddScoped(typeof(IRemovePortUseCase<>), typeof(RemovePortUseCase<>));
  64. services.AddScoped(typeof(IUpdatePortUseCase<>), typeof(UpdatePortUseCase<>));
  65. services.AddScoped(typeof(IAddNicUseCase<>), typeof(AddNicUseCase<>));
  66. services.AddScoped(typeof(IRemoveNicUseCase<>), typeof(RemoveNicUseCase<>));
  67. services.AddScoped(typeof(IUpdateNicUseCase<>), typeof(UpdateNicUseCase<>));
  68. var usecases = Assembly.GetAssembly(typeof(IUseCase))
  69. ?.GetTypes()
  70. .Where(t =>
  71. !t.IsAbstract &&
  72. typeof(IUseCase).IsAssignableFrom(t)
  73. );
  74. foreach (var type in usecases) services.AddScoped(type);
  75. return services;
  76. }
  77. public static IServiceCollection AddYamlRepos(
  78. this IServiceCollection services)
  79. {
  80. services.AddScoped<IHardwareRepository, YamlHardwareRepository>();
  81. services.AddScoped<ISystemRepository, YamlSystemRepository>();
  82. services.AddScoped<IServiceRepository, ServiceRepository>();
  83. return services;
  84. }
  85. }