Exemplo n.º 1
0
        public ContentNodeDataProvider(ILoggingService log, ContentNodeSitecoreItemFactory factory, IList <ITemplateFieldValueProvider> providers)
        {
            _log         = log;
            _itemFactory = factory;

            _categoryValueProvider = providers.OfType <ProductCategoryTemplateBuilder>().First();
            _catalogValueProvider  = providers.OfType <ProductCatalogTemplateBuilder>().First();

            _sitecoreItems = new Dictionary <ID, ISitecoreItem>();
        }
        /// <summary>
        /// Lazy setup of the dependencies
        /// </summary>
        /// <remarks>
        /// NB! NB! NB!
        ///
        /// The lifestyle of the data provider is controlled by Sitecore. It is created at application start,
        /// and remains in memory throughout.
        ///
        /// Therefore you MUST NOT use the ObjectFactory to create objects held by the data provider.
        /// The lifestyle of the created objects would be either "Thread" or "WebRequest". Keeping a
        /// reference longer than that is asking for trouble!
        /// </remarks>
        private bool EnsureDependenciesHaveBeenSet()
        {
            if (_dependenciesHaveBeenSet)
            {
                return(true);
            }

            lock (_lock)
            {
                if (_dependenciesHaveBeenSet)
                {
                    return(true);
                }

                var systemDataProvider = CreateSystemDataProvider();

                // I break the "lifestyle" rule stated above.
                // I can get away with it in this case, because I simply retrive data from the object,
                // and then it is allowed to be disposed. It is not kept alive.
                var standardTemplateFieldValueConfiguration =
                    ObjectFactory.Instance.Resolve <ISitecoreStandardTemplateFieldValueConfiguration>();

                _standardTemplateFieldValueProvider = new StandardTemplateFieldValueProvider(
                    new StandardFieldValuePersistor(),
                    standardTemplateFieldValueConfiguration.WhiteListTemplateIds,
                    standardTemplateFieldValueConfiguration.BlackListFieldIds
                    );

                var builders = CreateTemplateBuilders();

                _templateDataProvider = new TemplateDataProvider(_log, _userDefinedTemplateFolderId, new TemplateProvider(builders));
                _templateDataProvider.GetTemplateIds();                 // Called to make sure the templates are ready. They are needed below.

                // Field value providers
                var fieldValueProviders = builders.ToList <ITemplateFieldValueProvider>();

                // Content node data provider.
                var sitecoreItemfactory = new ContentNodeSitecoreItemFactory(fieldValueProviders);

                CreateProductAndContentNodeDataProviderAggregator(sitecoreItemfactory, fieldValueProviders);

                _sitecoreDataProviders = new List <ISitecoreDataProvider>
                {
                    _templateDataProvider,
                    systemDataProvider,
                    _dataProviderAggregator
                };
                SetupItemsWeDeliverChildrenFor();

                _dependenciesHaveBeenSet = true;
                _log.Log <DataProviderMasterDatabase>("Dependencies have been setup.");

                return(true);
            }
        }
        /// <summary>
        /// Create an aggregator containing the product and content node data provider.
        /// Excludes product data provider if IncludeProductData setting is false.
        /// </summary>
        /// <param name="sitecoreItemfactory"></param>
        /// <param name="fieldValueProviders"></param>
        private void CreateProductAndContentNodeDataProviderAggregator(ContentNodeSitecoreItemFactory sitecoreItemfactory,
                                                                       List <ITemplateFieldValueProvider> fieldValueProviders)
        {
            IList <ISitecoreDataProvider> dataProviders = new List <ISitecoreDataProvider>();

            var contentNodeDataProvider = new ContentNodeDataProvider(_log, sitecoreItemfactory, fieldValueProviders);

            dataProviders.Add(contentNodeDataProvider);

            if (_dataProviderSettings.IncludeProductData)
            {
                var productsDataProvider = new ProductsDataProvider(_log,
                                                                    new ProductNodeSitecoreItemFactory(fieldValueProviders), fieldValueProviders);
                dataProviders.Add(productsDataProvider);
            }

            // Create the aggregator provider for the products and the content.
            _dataProviderAggregator = new DataProviderAggregator(_rootItemId.Guid, dataProviders, sitecoreItemfactory);
        }
        public DataProviderAggregator(Guid entryPoint, IEnumerable <ISitecoreDataProvider> providers, ContentNodeSitecoreItemFactory factory)
        {
            _factory    = factory;
            _entryPoint = new ID(entryPoint);
            _providers  = providers.ToList();

            _root = CreateRoot();

            _firstLevelIds = new IDList {
                _root.Id
            };

            _secondLevelIds = new IDList();
            foreach (var provider in _providers)
            {
                provider.SetEntryIdInSitecoreTree(_root.Id);
                var ids = provider.GetFirstLevelIds();
                foreach (ID id in ids)
                {
                    _secondLevelIds.Add(id);
                }
            }
        }