Tengo la interfaz IOrder<T> y FurnitureOrder<T> la implementa
Necesito registrar múltiples implementaciones como esta
services.AddSingleton(IOrder<Chair>, FurnitureOrder<Chair>()) services.AddSingleton(IOrder<Table>, FurnitureOrder<Table>()) Ahora necesito recuperar todos los servicios de IOrder y los tipos (por ejemplo, silla, mesa) para hacer un trabajo de fondo en él. ¿Puedo obtenerlo usando la API de GetServices ? si no es posible, sugiera si se necesitan cambios de diseño
Una forma de hacerlo es introducir alguna interfaz común no genérica IOrder y registrar todos los servicios como tal (algo similar que hace un marco para el registro y ejecución de servicios alojados ):
interface IOrder { } interface IOrder<T> : IOrder { } services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrder, FurnitureOrder<Chair>>()); services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrder, FurnitureOrder<Table>>()); Y luego podrá inyectarlos como IEnumerable<IOrder> en su clase dependiente o usar IServiceProvider.GetServices<IOrder>() para resolverlos.
También tenga en cuenta que el próximo registro también debería funcionar:
services.AddSingleton<IOrder, FurnitureOrder<Chair>>() services.AddSingleton<IOrder, FurnitureOrder<Table>>()Si necesita registros genéricos, también puede automatizar el registro no genérico con algo como esto (después de registrar todos los genéricos):
var serviceDescriptors = services .Where(descriptor => descriptor.ServiceType.IsConstructedGenericType) .Where(descriptor => descriptor.ServiceType.GetGenericTypeDefinition() == typeof(IOrder<>)); foreach (var sd in serviceDescriptors) { services.TryAddEnumerable(ServiceDescriptor.Transient(typeof(IOrder), p => p.GetService(sd.ServiceType))); // or add desciptor creating new based on existing one }¿Supone que quiere decir durante la ejecución de ConfigureServices? Podrías hacer esto:
services.AddSingleton(typeof(IOrder<Chair>), f => new ChairOrder()); var listOf = new List<ServiceDescriptor>(); using var enumerator = services.GetEnumerator(); while (enumerator.MoveNext()) { var interfaceType = enumerator.Current.ServiceType; if (!interfaceType.IsGenericType) continue; if (interfaceType.Name.StartsWith("iorder", System.StringComparison.OrdinalIgnoreCase)) listOf.Add(enumerator.Current); } var sp = services.BuildServiceProvider(); foreach(var serviceDescriptor in listOf) { var interfaceIWant = serviceDescriptor.ServiceType; var objectToUse = sp.GetRequiredService(serviceDescriptor.ServiceType); //TODO: }