/// <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); }
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); } }