private static IEnumerable <ResourceDescriptor> FindIdentifiableTypes(Assembly assembly) { foreach (var type in assembly.GetTypes()) { if (TypeLocator.TryGetResourceDescriptor(type, out var descriptor)) { yield return(descriptor); } } }
private void AddDbContextResolvers(Assembly assembly) { var dbContextTypes = TypeLocator.GetDerivedTypes(assembly, typeof(DbContext)); foreach (var dbContextType in dbContextTypes) { var resolverType = typeof(DbContextResolver <>).MakeGenericType(dbContextType); _services.AddScoped(typeof(IDbContextResolver), resolverType); } }
private void RegisterImplementations(Assembly assembly, Type interfaceType, ResourceDescriptor resourceDescriptor) { var genericArguments = interfaceType.GetTypeInfo().GenericTypeParameters.Length == 2 ? new[] { resourceDescriptor.ResourceType, resourceDescriptor.IdType } : new[] { resourceDescriptor.ResourceType }; var result = TypeLocator.GetGenericInterfaceImplementation(assembly, interfaceType, genericArguments); if (result != null) { var(implementation, registrationInterface) = result.Value; _services.AddScoped(registrationInterface, implementation); } }
private static IEnumerable <ResourceDescriptor> ScanForResourceDescriptors(Assembly assembly) { foreach (var type in assembly.GetTypes()) { var resourceDescriptor = TypeLocator.TryGetResourceDescriptor(type); if (resourceDescriptor != null) { yield return(resourceDescriptor); } } }
private void RegisterServiceImplementations(Assembly assembly, Type interfaceType, ResourceDescriptor resourceDescriptor) { if (resourceDescriptor.IdType == typeof(Guid) && interfaceType.GetTypeInfo().GenericTypeParameters.Length == 1) { return; } var genericArguments = interfaceType.GetTypeInfo().GenericTypeParameters.Length == 2 ? new[] { resourceDescriptor.ResourceType, resourceDescriptor.IdType } : new[] { resourceDescriptor.ResourceType }; var service = TypeLocator.GetGenericInterfaceImplementation(assembly, interfaceType, genericArguments); if (service.implementation != null) { _services.AddScoped(service.registrationInterface, service.implementation); } }
private void AddResourceHookDefinitions(Assembly assembly, ResourceDescriptor identifiable) { try { var resourceDefinition = TypeLocator.GetDerivedGenericTypes(assembly, typeof(ResourceHooksDefinition <>), identifiable.ResourceType) .SingleOrDefault(); if (resourceDefinition != null) { _services.AddScoped(typeof(ResourceHooksDefinition <>).MakeGenericType(identifiable.ResourceType), resourceDefinition); } } catch (InvalidOperationException e) { throw new InvalidConfigurationException($"Cannot define multiple ResourceHooksDefinition<> implementations for '{identifiable.ResourceType}'", e); } }
private static HashSet <ResourceDescriptor> GetResourceTypesFromServiceImplementation(Type type) { var resourceDescriptors = new HashSet <ResourceDescriptor>(); var interfaces = type.GetInterfaces(); foreach (var i in interfaces) { if (i.IsGenericType) { var firstGenericArgument = i.GenericTypeArguments.FirstOrDefault(); if (TypeLocator.TryGetResourceDescriptor(firstGenericArgument, out var resourceDescriptor)) { resourceDescriptors.Add(resourceDescriptor); } } } return(resourceDescriptors); }
private static ResourceDescriptor TryGetResourceTypeFromServiceImplementation(Type serviceType) { foreach (var @interface in serviceType.GetInterfaces()) { var firstGenericArgument = @interface.IsGenericType ? @interface.GenericTypeArguments.First() : null; if (firstGenericArgument != null) { var resourceDescriptor = TypeLocator.TryGetResourceDescriptor(firstGenericArgument); if (resourceDescriptor != null) { return(resourceDescriptor); } } } return(null); }
/// <summary> /// Adds a json:api resource. /// </summary> /// <param name="resourceType">The resource model type.</param> /// <param name="idType">The resource model identifier type.</param> /// <param name="publicName"> /// The name under which the resource is publicly exposed by the API. /// If nothing is specified, the configured naming convention formatter will be applied. /// </param> public ResourceGraphBuilder Add(Type resourceType, Type idType = null, string publicName = null) { if (resourceType == null) { throw new ArgumentNullException(nameof(resourceType)); } if (_resources.All(e => e.ResourceType != resourceType)) { if (TypeHelper.IsOrImplementsInterface(resourceType, typeof(IIdentifiable))) { publicName ??= FormatResourceName(resourceType); idType ??= TypeLocator.TryGetIdType(resourceType); var resourceContext = CreateResourceContext(publicName, resourceType, idType); _resources.Add(resourceContext); } else { _logger.LogWarning($"Entity '{resourceType}' does not implement '{nameof(IIdentifiable)}'."); } } return(this); }
/// <summary> /// Adds a JSON:API resource. /// </summary> /// <param name="resourceType">The resource model type.</param> /// <param name="idType">The resource model identifier type.</param> /// <param name="publicName"> /// The name under which the resource is publicly exposed by the API. /// If nothing is specified, the configured naming convention formatter will be applied. /// </param> public ResourceGraphBuilder Add(Type resourceType, Type idType = null, string publicName = null) { ArgumentGuard.NotNull(resourceType, nameof(resourceType)); if (_resources.Any(e => e.ResourceType == resourceType)) { return(this); } if (TypeHelper.IsOrImplementsInterface(resourceType, typeof(IIdentifiable))) { var effectivePublicName = publicName ?? FormatResourceName(resourceType); var effectiveIdType = idType ?? TypeLocator.TryGetIdType(resourceType); var resourceContext = CreateResourceContext(effectivePublicName, resourceType, effectiveIdType); _resources.Add(resourceContext); } else { _logger.LogWarning($"Entity '{resourceType}' does not implement '{nameof(IIdentifiable)}'."); } return(this); }