コード例 #1
0
ファイル: MAppEntitiesHelper.cs プロジェクト: DenisTDR/MCMS
        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);
        }
コード例 #2
0
ファイル: MAppMappingHelper.cs プロジェクト: DenisTDR/MCMS
        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);
        }