private List <EntityTypeStack> ProcessSpecifications() { var allTypes = new MSpecificationsTypeFilter().FilterMapped(_app, true).ToList(); var entityTypes = allTypes.Where(type => typeof(IEntity).IsAssignableFrom(type)).ToList(); var entityConfigTypes = allTypes .Where(type => type.IsSubclassOfGenericType(typeof(EntityTypeConfiguration <>))) .ToList(); var stacks = entityTypes.Select(et => new EntityTypeStack(et)).ToList(); foreach (var entityConfigType in entityConfigTypes) { if (!entityConfigType.TryGetGenericTypeOfImplementedGenericType(typeof(EntityTypeConfiguration <>), out var genericType)) { continue; } var entityType = genericType.GenericTypeArguments.First(); var stack = stacks.FirstOrDefault(st => st.EntityType == entityType); if (stack == null) { throw new Exception( $"Can't register `{entityConfigType.Name}` because it's entity (`{entityType.Name}`) isn't registered!"); } stack.SetEntityTypeConfiguration(entityConfigType); } stacks.ForEach(st => st.Normalize()); return(stacks); }
private List <IMappingConfig> BuildStacks() { var listMappingConfigs = new List <IMappingConfig>(); var allTypes = new MSpecificationsTypeFilter().FilterMapped(_app).ToList(); var entityTypes = allTypes.Where(type => typeof(IEntity).IsAssignableFrom(type)).ToList(); var modelTypes = allTypes.Where(type => typeof(IViewModel).IsAssignableFrom(type) || typeof(IFormModel).IsAssignableFrom(type)).ToList(); var mappingConfigTypes = allTypes.Where(type => typeof(IMappingConfig).IsAssignableFrom(type) && !type.IsGenericTypeDefinition).ToList(); var mappingStacks = entityTypes.Select(et => new EntityMappingStack(et)).ToList(); foreach (var viewModelType in modelTypes) { var stack = mappingStacks.FirstOrDefault(st => st.CanPutModel(viewModelType)); stack?.WithModel(viewModelType); } foreach (var mappingConfigType in mappingConfigTypes) { var bestMatchStack = mappingStacks.Select(stack => new { stack, matchPoints = stack.CanPutMappingConfig(mappingConfigType) }).Where(b => b.matchPoints > 0).OrderByDescending(b => b.matchPoints).FirstOrDefault(); if (bestMatchStack != null) { bestMatchStack.stack.PutMappingConfig(mappingConfigType); } else { if (mappingConfigType.IsA(typeof(EntityViewModelMappingConfig <,>)) || mappingConfigType.IsA(typeof(EntityFormModelMappingConfig <,>))) { var stack = new EntityMappingStack(); stack.PutMappingConfig(mappingConfigType); mappingStacks.Add(stack); } else { listMappingConfigs.Add(Activator.CreateInstance(mappingConfigType) as IMappingConfig); } } } foreach (var entityMappingStack in mappingStacks) { entityMappingStack.TryNormalize(); } listMappingConfigs.AddRange(mappingStacks.SelectMany(stack => stack.MappingConfigsInstances())); return(listMappingConfigs); }