Beispiel #1
0
        private static void Seed(IServiceProvider serviceProvider)
        {
            using (var dbContext = serviceProvider.GetService <NewsAggregatorDBContext>())
            {
                dbContext.Database.Migrate();
                if (dbContext.DataSources.AnyAsync().Result)
                {
                    return;
                }

                dbContext.DataSources.Add(DataSourceAggregate.Create("BBC", "Top stories", "http://feeds.bbci.co.uk/news/rss.xml"));
                dbContext.SaveChanges();
            }
        }
Beispiel #2
0
        private async Task ExtractArticlesFromFeed(DataSourceAggregate datasource, CancellationToken cancellationToken)
        {
            var reader = XmlReader.Create(datasource.Url);
            var feed   = SyndicationFeed.Load(reader);

            reader.Close();
            var result = new List <ArticleAggregate>();

            foreach (var item in feed.Items.OrderBy(i => i.PublishDate))
            {
                if (!datasource.IsArticleExtracted(item.PublishDate))
                {
                    var article = ArticleAggregate.Create(item.Id, item.Title.Text, item.Summary.Text, null, "en", datasource.Id, item.PublishDate);
                    result.Add(article);
                }
            }

            if (!result.Any())
            {
                return;
            }

            using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
            {
                foreach (var article in result)
                {
                    await _articleRepository.Add(article, cancellationToken);
                }

                await _articleRepository.SaveChanges(cancellationToken);

                transactionScope.Complete();
            }

            foreach (var article in result)
            {
                await _busControl.Publish((ArticleAddedEvent)article.DomainEvts.First(), cancellationToken);
            }

            // await _articleManager.TrainArticles(result.Select(r => r.Language).Distinct(), cancellationToken);
            var lastArticle = result.OrderByDescending(a => a.PublishDate).FirstOrDefault();

            if (lastArticle != null)
            {
                datasource.AddHistory(lastArticle.PublishDate, result.Count());
            }
        }