예제 #1
0
        private bool TryRegisterPageType(ContentMetadataProvider contentMetadata, out PageMetadataProvider pageMetadataProvider)
        {
            if (TryGetPageMetadataByContentType(contentMetadata.ModelType, out pageMetadataProvider))
            {
                return(true);
            }

            if (!IsPageType(contentMetadata.ModelType.GetTypeInfo()))
            {
                pageMetadataProvider = null;
                return(false);
            }

            var pageAttribute = contentMetadata.ModelType.GetCustomAttribute <PageContentAttribute>(false);

            if (pageAttribute == null)
            {
                pageMetadataProvider = null;
                return(false);
            }

            PageMetadataProvider parentPageMetadata = null;

            if (contentMetadata.BaseMetadata != null)
            {
                TryRegisterPageType(contentMetadata.BaseMetadata, out parentPageMetadata);
            }

            pageMetadataProvider = AddPageType(contentMetadata, pageAttribute, parentPageMetadata);
            return(true);
        }
예제 #2
0
        public bool IsInheritedOrEqual(PageMetadataProvider baseMetadataProvider)
        {
            if (baseMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(baseMetadataProvider));
            }

            return(ContentMetadata.IsInheritedOrEqual(baseMetadataProvider.ContentMetadata));
        }
예제 #3
0
        internal PageMetadataProvider(ContentMetadataProvider contentMetadata, PageMetadataProvider parentPageMetadata)
        {
            ContentMetadata = contentMetadata;
            ParentMetadata  = parentPageMetadata;

            if (parentPageMetadata != null)
            {
                parentPageMetadata.derivedTypes.Add(this);
            }
        }
예제 #4
0
        private bool TryGetPageMetadataByContentType(Type contentType, out PageMetadataProvider pageMetadataProvider)
        {
            if (!typeObjectTypes.TryGetValue(contentType, out int index))
            {
                pageMetadataProvider = null;
                return(false);
            }

            pageMetadataProvider = metadataProviders[index];
            return(true);
        }
예제 #5
0
        private PageMetadataProvider AddPageType(ContentMetadataProvider contentMetadataProvider, PageContentAttribute pageAttribute, PageMetadataProvider parentPageMetadata)
        {
            if (!contentMetadataProvider.IsDefinedTitleField)
            {
                throw new InvalidOperationException("Тип контента не может быть контентом страницы, так как для него не определено поле заголовка.");
            }

            var pageMetadata = new PageMetadataProvider(contentMetadataProvider, parentPageMetadata);

            var index = metadataProviders.Count;

            metadataProviders.Add(pageMetadata);
            typeNames.Add(contentMetadataProvider.Name.ToLower(), index);
            typeObjectTypes.Add(contentMetadataProvider.ModelType, index);

            return(pageMetadata);
        }
예제 #6
0
        public static IEnumerable <PageMetadataProvider> GetDerivedMetadataWithHierarhy(this PageMetadataProvider pageMetadata, bool includeCurrent)
        {
            if (includeCurrent)
            {
                yield return(pageMetadata);
            }

            foreach (var derivedPageMetadata in pageMetadata.DerivedTypes)
            {
                yield return(derivedPageMetadata);

                foreach (var childDerivedPageMetadata in GetDerivedMetadataWithHierarhy(derivedPageMetadata, false))
                {
                    yield return(childDerivedPageMetadata);
                }
            }
        }