예제 #1
0
 private static IEnumerable <ResourceDescriptor> FindIdentifiableTypes(Assembly assembly)
 {
     foreach (var type in assembly.GetTypes())
     {
         if (TypeLocator.TryGetResourceDescriptor(type, out var descriptor))
         {
             yield return(descriptor);
         }
     }
 }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
         }
     }
 }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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);
        }
예제 #8
0
        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);
        }
예제 #10
0
        /// <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);
        }