diff --git a/src/ApplicationCore/Interfaces/IRepository.cs b/src/ApplicationCore/Interfaces/IRepository.cs deleted file mode 100644 index f7bf513..0000000 --- a/src/ApplicationCore/Interfaces/IRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.eShopWeb.ApplicationCore.Entities; -using System.Collections.Generic; - -namespace Microsoft.eShopWeb.ApplicationCore.Interfaces -{ - public interface IRepository where T : BaseEntity - { - T GetById(int id); - T GetSingleBySpec(ISpecification spec); - IEnumerable ListAll(); - IEnumerable List(ISpecification spec); - T Add(T entity); - void Update(T entity); - void Delete(T entity); - int Count(ISpecification spec); - } -} diff --git a/src/ApplicationCore/Services/BasketService.cs b/src/ApplicationCore/Services/BasketService.cs index 7d3011a..1f39f85 100644 --- a/src/ApplicationCore/Services/BasketService.cs +++ b/src/ApplicationCore/Services/BasketService.cs @@ -15,10 +15,8 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services private readonly IAsyncRepository _basketItemRepository; private readonly IUriComposer _uriComposer; private readonly IAppLogger _logger; - private readonly IRepository _itemRepository; public BasketService(IAsyncRepository basketRepository, - IRepository itemRepository, IUriComposer uriComposer, IAppLogger logger, IAsyncRepository basketItemRepository) @@ -26,7 +24,6 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services _basketRepository = basketRepository; _uriComposer = uriComposer; _logger = logger; - _itemRepository = itemRepository; _basketItemRepository = basketItemRepository; } diff --git a/src/Infrastructure/Data/EfRepository.cs b/src/Infrastructure/Data/EfRepository.cs index 4fe8c60..8688e14 100644 --- a/src/Infrastructure/Data/EfRepository.cs +++ b/src/Infrastructure/Data/EfRepository.cs @@ -12,7 +12,7 @@ namespace Microsoft.eShopWeb.Infrastructure.Data /// https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-methods/ /// /// - public class EfRepository : IRepository, IAsyncRepository where T : BaseEntity + public class EfRepository : IAsyncRepository where T : BaseEntity { protected readonly CatalogContext _dbContext; @@ -20,59 +20,27 @@ namespace Microsoft.eShopWeb.Infrastructure.Data { _dbContext = dbContext; } - - public virtual T GetById(int id) - { - return _dbContext.Set().Find(id); - } - - public T GetSingleBySpec(ISpecification spec) - { - return List(spec).FirstOrDefault(); - } - + public virtual async Task GetByIdAsync(int id) { return await _dbContext.Set().FindAsync(id); } - - public IEnumerable ListAll() - { - return _dbContext.Set().AsEnumerable(); - } - + public async Task> ListAllAsync() { return await _dbContext.Set().ToListAsync(); } - public IEnumerable List(ISpecification spec) - { - return ApplySpecification(spec).AsEnumerable(); - } public async Task> ListAsync(ISpecification spec) { return await ApplySpecification(spec).ToListAsync(); } - public int Count(ISpecification spec) - { - return ApplySpecification(spec).Count(); - } - public async Task CountAsync(ISpecification spec) { return await ApplySpecification(spec).CountAsync(); } - public T Add(T entity) - { - _dbContext.Set().Add(entity); - _dbContext.SaveChanges(); - - return entity; - } - public async Task AddAsync(T entity) { _dbContext.Set().Add(entity); @@ -80,24 +48,12 @@ namespace Microsoft.eShopWeb.Infrastructure.Data return entity; } - - public void Update(T entity) - { - _dbContext.Entry(entity).State = EntityState.Modified; - _dbContext.SaveChanges(); - } public async Task UpdateAsync(T entity) { _dbContext.Entry(entity).State = EntityState.Modified; await _dbContext.SaveChangesAsync(); } - - public void Delete(T entity) - { - _dbContext.Set().Remove(entity); - _dbContext.SaveChanges(); - } public async Task DeleteAsync(T entity) { diff --git a/src/Web/Services/BasketViewModelService.cs b/src/Web/Services/BasketViewModelService.cs index 11e9612..b4801f6 100644 --- a/src/Web/Services/BasketViewModelService.cs +++ b/src/Web/Services/BasketViewModelService.cs @@ -14,10 +14,10 @@ namespace Microsoft.eShopWeb.Web.Services { private readonly IAsyncRepository _basketRepository; private readonly IUriComposer _uriComposer; - private readonly IRepository _itemRepository; + private readonly IAsyncRepository _itemRepository; public BasketViewModelService(IAsyncRepository basketRepository, - IRepository itemRepository, + IAsyncRepository itemRepository, IUriComposer uriComposer) { _basketRepository = basketRepository; @@ -34,30 +34,15 @@ namespace Microsoft.eShopWeb.Web.Services { return await CreateBasketForUser(userName); } - return CreateViewModelFromBasket(basket); + return await CreateViewModelFromBasket(basket); } - private BasketViewModel CreateViewModelFromBasket(Basket basket) + private async Task CreateViewModelFromBasket(Basket basket) { var viewModel = new BasketViewModel(); viewModel.Id = basket.Id; viewModel.BuyerId = basket.BuyerId; - viewModel.Items = basket.Items.Select(i => - { - var itemModel = new BasketItemViewModel() - { - Id = i.Id, - UnitPrice = i.UnitPrice, - Quantity = i.Quantity, - CatalogItemId = i.CatalogItemId - - }; - var item = _itemRepository.GetById(i.CatalogItemId); - itemModel.PictureUrl = _uriComposer.ComposePicUri(item.PictureUri); - itemModel.ProductName = item.Name; - return itemModel; - }) - .ToList(); + viewModel.Items = await GetBasketItems(basket.Items); ; return viewModel; } @@ -73,5 +58,26 @@ namespace Microsoft.eShopWeb.Web.Services Items = new List() }; } + + private async Task> GetBasketItems(IReadOnlyCollection basketItems) + { + var items = new List(); + foreach (var item in basketItems) + { + var itemModel = new BasketItemViewModel + { + Id = item.Id, + UnitPrice = item.UnitPrice, + Quantity = item.Quantity, + CatalogItemId = item.CatalogItemId + }; + var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId); + itemModel.PictureUrl = _uriComposer.ComposePicUri(catalogItem.PictureUri); + itemModel.ProductName = catalogItem.Name; + items.Add(itemModel); + } + + return items; + } } } diff --git a/src/Web/Services/CatalogService.cs b/src/Web/Services/CatalogService.cs index ad7fbeb..5229aa5 100644 --- a/src/Web/Services/CatalogService.cs +++ b/src/Web/Services/CatalogService.cs @@ -18,14 +18,14 @@ namespace Microsoft.eShopWeb.Web.Services public class CatalogService : ICatalogService { private readonly ILogger _logger; - private readonly IRepository _itemRepository; + private readonly IAsyncRepository _itemRepository; private readonly IAsyncRepository _brandRepository; private readonly IAsyncRepository _typeRepository; private readonly IUriComposer _uriComposer; public CatalogService( ILoggerFactory loggerFactory, - IRepository itemRepository, + IAsyncRepository itemRepository, IAsyncRepository brandRepository, IAsyncRepository typeRepository, IUriComposer uriComposer) @@ -46,13 +46,13 @@ namespace Microsoft.eShopWeb.Web.Services new CatalogFilterPaginatedSpecification(itemsPage * pageIndex, itemsPage, brandId, typeId); // the implementation below using ForEach and Count. We need a List. - var itemsOnPage = _itemRepository.List(filterPaginatedSpecification).ToList(); - var totalItems = _itemRepository.Count(filterSpecification); + var itemsOnPage = await _itemRepository.ListAsync(filterPaginatedSpecification); + var totalItems = await _itemRepository.CountAsync(filterSpecification); - itemsOnPage.ForEach(x => + foreach (var itemOnPage in itemsOnPage) { - x.PictureUri = _uriComposer.ComposePicUri(x.PictureUri); - }); + itemOnPage.PictureUri = _uriComposer.ComposePicUri(itemOnPage.PictureUri); + } var vm = new CatalogIndexViewModel() { diff --git a/src/Web/Startup.cs b/src/Web/Startup.cs index 2bf29e3..a8c41a8 100644 --- a/src/Web/Startup.cs +++ b/src/Web/Startup.cs @@ -84,8 +84,7 @@ namespace Microsoft.eShopWeb.Web ConfigureCookieSettings(services); CreateIdentityIfNotCreated(services); - - services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); + services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>)); services.AddScoped(); diff --git a/tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs b/tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs index c9014f1..73774c2 100644 --- a/tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs +++ b/tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs @@ -38,7 +38,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.BasketItemRepositoryT await _basketItemRepository.DeleteAsync(existingBasket.Items.FirstOrDefault()); _catalogContext.SaveChanges(); - var basketFromDB = _basketRepository.GetById(BasketBuilder.BasketId); + var basketFromDB = await _basketRepository.GetByIdAsync(BasketBuilder.BasketId); Assert.Equal(0, basketFromDB.Items.Count); } diff --git a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs index b069e1a..7991c29 100644 --- a/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs +++ b/tests/IntegrationTests/Repositories/OrderRepositoryTests/GetById.cs @@ -4,6 +4,7 @@ using System.Linq; using Microsoft.eShopWeb.UnitTests.Builders; using Xunit; using Xunit.Abstractions; +using System.Threading.Tasks; namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests { @@ -24,7 +25,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests } [Fact] - public void GetsExistingOrder() + public async Task GetsExistingOrder() { var existingOrder = OrderBuilder.WithDefaultValues(); _catalogContext.Orders.Add(existingOrder); @@ -32,7 +33,7 @@ namespace Microsoft.eShopWeb.IntegrationTests.Repositories.OrderRepositoryTests int orderId = existingOrder.Id; _output.WriteLine($"OrderId: {orderId}"); - var orderFromRepo = _orderRepository.GetById(orderId); + var orderFromRepo = await _orderRepository.GetByIdAsync(orderId); Assert.Equal(OrderBuilder.TestBuyerId, orderFromRepo.BuyerId); // Note: Using InMemoryDatabase OrderItems is available. Will be null if using SQL DB. diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs index dae2c64..79bdd18 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/DeleteBasket.cs @@ -26,7 +26,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes basket.AddItem(2, It.IsAny(), It.IsAny()); _mockBasketRepo.Setup(x => x.GetByIdAsync(It.IsAny())) .ReturnsAsync(basket); - var basketService = new BasketService(_mockBasketRepo.Object, null, null, null, _mockBasketItemRepo.Object); + var basketService = new BasketService(_mockBasketRepo.Object, null, null, _mockBasketItemRepo.Object); await basketService.DeleteBasketAsync(It.IsAny()); diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs index 7de18e3..9c5f11d 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/SetQuantities.cs @@ -21,7 +21,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes [Fact] public async void ThrowsGivenInvalidBasketId() { - var basketService = new BasketService(_mockBasketRepo.Object, null, null, null, null); + var basketService = new BasketService(_mockBasketRepo.Object, null, null, null); await Assert.ThrowsAsync(async () => await basketService.SetQuantities(_invalidId, new System.Collections.Generic.Dictionary())); @@ -30,7 +30,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes [Fact] public async void ThrowsGivenNullQuantities() { - var basketService = new BasketService(null, null, null, null, null); + var basketService = new BasketService(null, null, null, null); await Assert.ThrowsAsync(async () => await basketService.SetQuantities(123, null)); diff --git a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs index 41e1069..38c0a30 100644 --- a/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs +++ b/tests/UnitTests/ApplicationCore/Services/BasketServiceTests/TransferBasket.cs @@ -9,7 +9,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes [Fact] public async void ThrowsGivenNullAnonymousId() { - var basketService = new BasketService(null, null, null, null, null); + var basketService = new BasketService(null, null, null, null); await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync(null, "steve")); } @@ -17,7 +17,7 @@ namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Services.BasketServiceTes [Fact] public async void ThrowsGivenNullUserId() { - var basketService = new BasketService(null, null, null, null, null); + var basketService = new BasketService(null, null, null, null); await Assert.ThrowsAsync(async () => await basketService.TransferBasketAsync("abcdefg", null)); }