/// <summary>
        /// Add <see cref="IResourceService{T, TId}"/> implementations to container.
        /// </summary>
        /// <param name="assembly">The assembly to search for resources in.</param>
        public ServiceDiscoveryFacade AddServices(Assembly assembly)
        {
            var resourceDescriptors = TypeLocator.GetIdentifableTypes(assembly);

            foreach (var resourceDescriptor in resourceDescriptors)
            {
                AddServices(assembly, resourceDescriptor);
            }
            return(this);
        }
        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 static IEnumerable <ResourceDescriptor> FindIdentifiableTypes(Assembly assembly)
 {
     foreach (var type in assembly.GetTypes())
     {
         if (TypeLocator.TryGetResourceDescriptor(type, out var descriptor))
         {
             yield return(descriptor);
         }
     }
 }
        /// <summary>
        /// Adds resources to the resourceGraph and registers <see cref="ResourceDefinition{T}"/> types on the container.
        /// </summary>
        /// <param name="assembly">The assembly to search for resources in.</param>
        public ServiceDiscoveryFacade AddResources(Assembly assembly)
        {
            var identifiables = TypeLocator.GetIdentifableTypes(assembly);

            foreach (var identifiable in identifiables)
            {
                AddResource(assembly, identifiable);
            }

            return(this);
        }
        /// <summary>
        /// Adds resources to the graph and registers <see cref="ResourceDefinition{T}"/> types on the container.
        /// </summary>
        /// <param name="assembly">The assembly to search for resources in.</param>
        /// <param name="resourceNameFormatter">The type name formatter used to get the string representation of resource names.</param>
        public ServiceDiscoveryFacade AddAssemblyResources(Assembly assembly, IResourceNameFormatter resourceNameFormatter = null)
        {
            var identifiables = TypeLocator.GetIdentifableTypes(assembly);

            foreach (var identifiable in identifiables)
            {
                RegisterResourceDefinition(assembly, identifiable);
                AddResourceToGraph(identifiable, resourceNameFormatter);
            }

            return(this);
        }
예제 #6
0
        private void RegisterServiceImplementations(Assembly assembly, Type interfaceType, ResourceDescriptor resourceDescriptor)
        {
            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);
            }
        }
        /// <summary>
        /// Add resources, services and repository implementations to the container.
        /// </summary>
        /// <param name="assembly">The assembly to search for resources in.</param>
        public ServiceDiscoveryFacade AddAssembly(Assembly assembly)
        {
            AddDbContextResolvers(assembly);

            var resourceDescriptors = TypeLocator.GetIdentifableTypes(assembly);

            foreach (var resourceDescriptor in resourceDescriptors)
            {
                AddResource(assembly, resourceDescriptor);
                AddServices(assembly, resourceDescriptor);
                AddRepositories(assembly, resourceDescriptor);
            }
            return(this);
        }
        private ServiceDiscoveryFacade RegisterServiceImplementations(Assembly assembly, Type interfaceType)
        {
            var identifiables = TypeLocator.GetIdentifableTypes(assembly);

            foreach (var identifiable in identifiables)
            {
                var service = TypeLocator.GetGenericInterfaceImplementation(assembly, interfaceType, identifiable.ResourceType, identifiable.IdType);
                if (service.implementation != null)
                {
                    _services.AddScoped(service.registrationInterface, service.implementation);
                }
            }

            return(this);
        }
        private void RegisterResourceDefinition(Assembly assembly, ResourceDescriptor identifiable)
        {
            try
            {
                var resourceDefinition = TypeLocator.GetDerivedGenericTypes(assembly, typeof(ResourceDefinition <>), identifiable.ResourceType)
                                         .SingleOrDefault();

                if (resourceDefinition != null)
                {
                    _services.AddScoped(typeof(ResourceDefinition <>).MakeGenericType(identifiable.ResourceType), resourceDefinition);
                }
            }
            catch (InvalidOperationException e)
            {
                throw new JsonApiSetupException($"Cannot define multiple ResourceDefinition<> implementations for '{identifiable.ResourceType}'", e);
            }
        }
        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?.Name == "CustomArticleService" && genericArguments[0].Name != "Article")
            //{
            //    service = TypeLocator.GetGenericInterfaceImplementation(assembly, interfaceType, genericArguments);
            //}
            if (service.implementation != null)
            {
                _services.AddScoped(service.registrationInterface, service.implementation);
            }
        }
        private void RegisterResourceDefinition(Assembly assembly, ResourceDescriptor identifiable)
        {
            try
            {
                var resourceDefinition = TypeLocator.GetDerivedGenericTypes(assembly, typeof(ResourceDefinition <>), identifiable.ResourceType)
                                         .SingleOrDefault();

                if (resourceDefinition != null)
                {
                    _services.AddScoped(typeof(ResourceDefinition <>).MakeGenericType(identifiable.ResourceType), resourceDefinition);
                }
            }
            catch (InvalidOperationException e)
            {
                // TODO: need a better way to communicate failure since this is unlikely to occur during a web request
                throw new JsonApiException(500,
                                           $"Cannot define multiple ResourceDefinition<> implementations for '{identifiable.ResourceType}'", e);
            }
        }