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(); } }
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()); } }