ServiceCollectionExtensions.cs 3.2 KB

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