Ejemplo n.º 1
0
        private ModelMetadataRegistryItem CreateModelMetadataRegistryItem([NotNull] Type modelType)
        {
            Invariant.IsNotNull(modelType, "modelType");

            IModelMetadataConfiguration configuration;

            if (!configurations.TryGetValue(modelType, out configuration))
            {
                configuration = configurations
                                .Where(kvp => kvp.Key.IsAssignableFrom(modelType))
                                .OrderBy(x => x.Key, new TypeInheritanceComparer())
                                .Select(x => x.Value)
                                .FirstOrDefault();
            }

            var canAcceptConventions = ConventionAcceptor.CanAcceptConventions(new AcceptorContext(modelType, configuration != null));

            if (configuration == null && !canAcceptConventions)
            {
                return(null);
            }

            var item = new ModelMetadataRegistryItem();

            if (canAcceptConventions)
            {
                var properties = modelType.GetProperties();
                foreach (var convention in conventions)
                {
                    foreach (var pi in properties)
                    {
                        if (convention.IsApplicable(pi))
                        {
                            var propertyMetadata = item.GetPropertyMetadataOrCreateNew(pi.Name);
                            convention.Apply(pi, propertyMetadata);
                        }
                    }
                }
            }

            if (configuration != null)
            {
                foreach (var pair in configuration.Configurations)
                {
                    var name             = pair.Key;
                    var configurator     = pair.Value;
                    var propertyMetadata = item.GetPropertyMetadataOrCreateNew(name);
                    configurator.Configure(propertyMetadata);
                }
            }

            return(item);
        }