/// <summary> /// Discovers the implemented hooks for a model. /// </summary> /// <returns>The implemented hooks for model.</returns> void DiscoverImplementedHooksForModel() { Type parameterizedResourceDefinition = typeof(ResourceDefinition <TEntity>); var derivedTypes = TypeLocator.GetDerivedTypes(typeof(TEntity).Assembly, parameterizedResourceDefinition).ToList(); var implementedHooks = new List <ResourceHook>(); var enabledHooks = new List <ResourceHook>() { ResourceHook.BeforeImplicitUpdateRelationship }; var disabledHooks = new List <ResourceHook>(); Type targetType = null; try { targetType = derivedTypes.SingleOrDefault(); // multiple containers is not supported } catch { throw new JsonApiSetupException($"It is currently not supported to" + "implement hooks across multiple implementations of ResourceDefinition<T>"); } if (targetType != null) { foreach (var hook in _allHooks) { var method = targetType.GetMethod(hook.ToString("G")); if (method.DeclaringType != parameterizedResourceDefinition) { implementedHooks.Add(hook); var attr = method.GetCustomAttributes(true).OfType <LoadDatabaseValues>().SingleOrDefault(); if (attr != null) { if (!_databaseValuesAttributeAllowed.Contains(hook)) { throw new JsonApiSetupException($"DatabaseValuesAttribute cannot be used on hook" + $"{hook.ToString("G")} in resource definition {parameterizedResourceDefinition.Name}"); } var targetList = attr.value ? enabledHooks : disabledHooks; targetList.Add(hook); } } } } ImplementedHooks = implementedHooks.ToArray(); DatabaseValuesDisabledHooks = disabledHooks.ToArray(); DatabaseValuesEnabledHooks = enabledHooks.ToArray(); }