ServiceCollectionExtensions.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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.Hardware.Desktops;
  7. using RackPeek.Domain.Resources.Models;
  8. using RackPeek.Domain.Resources.Services;
  9. using RackPeek.Domain.Resources.SystemResources;
  10. using RackPeek.Domain.UseCases;
  11. using RackPeek.Domain.UseCases.Tags;
  12. namespace RackPeek.Domain;
  13. public interface IResourceUseCase<T> where T : Resource
  14. {
  15. }
  16. public static class ServiceCollectionExtensions
  17. {
  18. public static IServiceCollection AddResourceUseCases(
  19. this IServiceCollection services,
  20. Assembly assembly)
  21. {
  22. var types = assembly.GetTypes()
  23. .Where(t => !t.IsAbstract && !t.IsInterface);
  24. foreach (var type in types)
  25. {
  26. var resourceUseCaseInterfaces = type.GetInterfaces()
  27. .Where(i =>
  28. i.IsGenericType &&
  29. i.GetInterfaces().Any(parent =>
  30. parent.IsGenericType &&
  31. parent.GetGenericTypeDefinition() == typeof(IResourceUseCase<>)));
  32. foreach (var serviceType in resourceUseCaseInterfaces)
  33. {
  34. services.AddScoped(serviceType, type);
  35. }
  36. }
  37. return services;
  38. }
  39. public static IServiceCollection AddUseCases(
  40. this IServiceCollection services)
  41. {
  42. services.AddScoped(typeof(IAddResourceUseCase<>), typeof(AddResourceUseCase<>));
  43. services.AddScoped(typeof(IAddTagUseCase<>), typeof(AddTagUseCase<>));
  44. services.AddScoped(typeof(ICloneResourceUseCase<>), typeof(CloneResourceUseCase<>));
  45. services.AddScoped(typeof(IDeleteResourceUseCase<>), typeof(DeleteResourceUseCase<>));
  46. services.AddScoped(typeof(IRemoveTagUseCase<>), typeof(RemoveTagUseCase<>));
  47. services.AddScoped(typeof(IGetAllResourcesByKindUseCase<>), typeof(GetAllResourcesByKindUseCase<>));
  48. services.AddScoped(typeof(IGetResourceByNameUseCase<>), typeof(GetResourceByNameUseCase<>));
  49. services.AddScoped(typeof(IRenameResourceUseCase<>), typeof(RenameResourceUseCase<>));
  50. var usecases = Assembly.GetAssembly(typeof(IUseCase))
  51. ?.GetTypes()
  52. .Where(t =>
  53. !t.IsAbstract &&
  54. typeof(IUseCase).IsAssignableFrom(t)
  55. );
  56. foreach (var type in usecases) services.AddScoped(type);
  57. return services;
  58. }
  59. public static IServiceCollection AddYamlRepos(
  60. this IServiceCollection services)
  61. {
  62. services.AddScoped<IHardwareRepository, YamlHardwareRepository>();
  63. services.AddScoped<ISystemRepository, YamlSystemRepository>();
  64. services.AddScoped<IServiceRepository, YamlServiceRepository>();
  65. return services;
  66. }
  67. }