Browse Source

Enforcing IAggregateRoot (#273)

- Enforcing it on the Async and EfRepositories
- Making CatalogBrand, Item, and Type AggregateRoots because they are
just lookup tables
main
Eric Fleming 6 years ago
committed by Steve Smith
parent
commit
7c092ba5ad
  1. 6
      src/ApplicationCore/Entities/CatalogBrand.cs
  2. 6
      src/ApplicationCore/Entities/CatalogItem.cs
  3. 6
      src/ApplicationCore/Entities/CatalogType.cs
  4. 2
      src/ApplicationCore/Interfaces/IAsyncRepository.cs
  5. 2
      src/Infrastructure/Data/EfRepository.cs
  6. 46
      tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs

6
src/ApplicationCore/Entities/CatalogBrand.cs

@ -1,6 +1,8 @@
namespace Microsoft.eShopWeb.ApplicationCore.Entities
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
namespace Microsoft.eShopWeb.ApplicationCore.Entities
{
public class CatalogBrand : BaseEntity
public class CatalogBrand : BaseEntity, IAggregateRoot
{
public string Brand { get; set; }
}

6
src/ApplicationCore/Entities/CatalogItem.cs

@ -1,6 +1,8 @@
namespace Microsoft.eShopWeb.ApplicationCore.Entities
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
namespace Microsoft.eShopWeb.ApplicationCore.Entities
{
public class CatalogItem : BaseEntity
public class CatalogItem : BaseEntity, IAggregateRoot
{
public string Name { get; set; }
public string Description { get; set; }

6
src/ApplicationCore/Entities/CatalogType.cs

@ -1,6 +1,8 @@
namespace Microsoft.eShopWeb.ApplicationCore.Entities
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
namespace Microsoft.eShopWeb.ApplicationCore.Entities
{
public class CatalogType : BaseEntity
public class CatalogType : BaseEntity, IAggregateRoot
{
public string Type { get; set; }
}

2
src/ApplicationCore/Interfaces/IAsyncRepository.cs

@ -4,7 +4,7 @@ using System.Threading.Tasks;
namespace Microsoft.eShopWeb.ApplicationCore.Interfaces
{
public interface IAsyncRepository<T> where T : BaseEntity
public interface IAsyncRepository<T> where T : BaseEntity, IAggregateRoot
{
Task<T> GetByIdAsync(int id);
Task<IReadOnlyList<T>> ListAllAsync();

2
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/
/// </summary>
/// <typeparam name="T"></typeparam>
public class EfRepository<T> : IAsyncRepository<T> where T : BaseEntity
public class EfRepository<T> : IAsyncRepository<T> where T : BaseEntity, IAggregateRoot
{
protected readonly CatalogContext _dbContext;

46
tests/IntegrationTests/Repositories/BasketItemRepositoryTests/DeleteAsync_Should.cs

@ -1,46 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Microsoft.eShopWeb.Infrastructure.Data;
using Microsoft.eShopWeb.UnitTests.Builders;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
namespace Microsoft.eShopWeb.IntegrationTests.Repositories.BasketItemRepositoryTests
{
public class DeleteAsync_Should
{
private readonly CatalogContext _catalogContext;
private readonly EfRepository<Basket> _basketRepository;
private readonly EfRepository<BasketItem> _basketItemRepository;
private BasketBuilder BasketBuilder { get; } = new BasketBuilder();
private readonly ITestOutputHelper _output;
public DeleteAsync_Should(ITestOutputHelper output)
{
_output = output;
var dbOptions = new DbContextOptionsBuilder<CatalogContext>()
.UseInMemoryDatabase(databaseName: "TestCatalog")
.Options;
_catalogContext = new CatalogContext(dbOptions);
_basketRepository = new EfRepository<Basket>(_catalogContext);
_basketItemRepository = new EfRepository<BasketItem>(_catalogContext);
}
[Fact]
public async Task DeleteItemFromBasket()
{
var existingBasket = BasketBuilder.WithOneBasketItem();
_catalogContext.Add(existingBasket);
_catalogContext.SaveChanges();
await _basketItemRepository.DeleteAsync(existingBasket.Items.FirstOrDefault());
_catalogContext.SaveChanges();
var basketFromDB = await _basketRepository.GetByIdAsync(BasketBuilder.BasketId);
Assert.Equal(0, basketFromDB.Items.Count);
}
}
}
Loading…
Cancel
Save