From 75b9c0abbb1bfd1d98bef96fee7ca8880a33c8bd Mon Sep 17 00:00:00 2001 From: Innok Mikhalev Date: Thu, 9 Dec 2021 15:36:08 +1300 Subject: [PATCH 1/4] feat: add db seeding to get testing data in swagger; --- .../Common/ApplicationDbContextFactory.cs | 39 +++++++++++++++++++ src/Generator/Startup.cs | 14 +++++++ 2 files changed, 53 insertions(+) create mode 100644 src/Generator.Persistence.Adapter/Common/ApplicationDbContextFactory.cs diff --git a/src/Generator.Persistence.Adapter/Common/ApplicationDbContextFactory.cs b/src/Generator.Persistence.Adapter/Common/ApplicationDbContextFactory.cs new file mode 100644 index 0000000..afd0c1e --- /dev/null +++ b/src/Generator.Persistence.Adapter/Common/ApplicationDbContextFactory.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using Generator.DomainApi.Model; +using Generator.Persistence.Adapter.Context; +using Microsoft.EntityFrameworkCore; + +namespace Generator.Persistence.Adapter.Common +{ + public static class ApplicationDbContextFactory + { + public static List GetDeals() + { + return new List() + { + new Deal(){Id=1, Name="ABC", Description="ABC deal 123"}, + new Deal(){Id=2, Name="ABC", Description="ABC deal 456"}, + new Deal(){Id=3, Name="ABC", Description="ABC deal 789"}, + }; + } + + public static ApplicationDbContext Create() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + + var context = new ApplicationDbContext(options); + context.Database.EnsureCreated(); + context.Deals.AddRange(GetDeals()); + context.SaveChanges(); + return context; + } + public static void Destroy(ApplicationDbContext dbContext) + { + dbContext.Database.EnsureDeleted(); + dbContext.Dispose(); + } + } +} diff --git a/src/Generator/Startup.cs b/src/Generator/Startup.cs index 8aa9493..617531c 100644 --- a/src/Generator/Startup.cs +++ b/src/Generator/Startup.cs @@ -2,6 +2,8 @@ using Generator.DomainApi.Services; using Generator.Extension; using Generator.Persistence.Adapter; +using Generator.Persistence.Adapter.Common; +using Generator.Persistence.Adapter.Context; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -46,6 +48,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); + SeedTestingData(app); } app.UseHttpsRedirection(); @@ -67,5 +70,16 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF endpoints.MapControllers(); }); } + + private void SeedTestingData(IApplicationBuilder app) + { + using (var serviceScope = app.ApplicationServices.CreateScope()) + { + var context = serviceScope.ServiceProvider.GetService(); + + context.Deals.AddRange(ApplicationDbContextFactory.GetDeals()); + context.SaveChanges(); + } + } } } From d292c8ebc9324854fed9ef58471365565c7be316 Mon Sep 17 00:00:00 2001 From: Innok Mikhalev Date: Thu, 9 Dec 2021 15:47:15 +1300 Subject: [PATCH 2/4] refactor: inverting Persistence dependency from Domain layer; --- src/Generator.Domain/DealDomain.cs | 18 ++++---- .../Port/IApplicationDbContext.cs | 7 +++ src/Generator.DomainApi/Port/IDealSet.cs | 14 ++++++ .../Context/ApplicationDbContext.cs | 14 +++++- .../Context/DealSet.cs | 43 +++++++++++++++++++ .../PersistenceExtensions.cs | 5 ++- 6 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 src/Generator.DomainApi/Port/IApplicationDbContext.cs create mode 100644 src/Generator.DomainApi/Port/IDealSet.cs create mode 100644 src/Generator.Persistence.Adapter/Context/DealSet.cs diff --git a/src/Generator.Domain/DealDomain.cs b/src/Generator.Domain/DealDomain.cs index 0932301..0945ce7 100644 --- a/src/Generator.Domain/DealDomain.cs +++ b/src/Generator.Domain/DealDomain.cs @@ -1,29 +1,27 @@ using Generator.DomainApi.Port; -using Generator.Persistence.Adapter.Context; -using Microsoft.EntityFrameworkCore; +using Generator.DomainApi.Model; using System.Collections.Generic; -using System.Linq; namespace Generator.Domain { - public class DealDomain : IRequestDeal where T : class + public class DealDomain : IRequestDeal where T : Deal { - private readonly DbSet table; + private readonly IDealSet table; - public DealDomain(ApplicationDbContext dbContext) + public DealDomain(IApplicationDbContext dbContext) { - ApplicationDbContext _dbContext; + IApplicationDbContext _dbContext; _dbContext = dbContext; - table = _dbContext.Set(); + table = _dbContext.Deals; } public T GetDeal(int id) { - return table.Find(id); + return table.Find(id); } public List GetDeals() { - return table.ToList(); + return table.ToList(); } } } diff --git a/src/Generator.DomainApi/Port/IApplicationDbContext.cs b/src/Generator.DomainApi/Port/IApplicationDbContext.cs new file mode 100644 index 0000000..b3fb7ae --- /dev/null +++ b/src/Generator.DomainApi/Port/IApplicationDbContext.cs @@ -0,0 +1,7 @@ +namespace Generator.DomainApi.Port +{ + public interface IApplicationDbContext + { + public IDealSet Deals { get; set; } + } +} \ No newline at end of file diff --git a/src/Generator.DomainApi/Port/IDealSet.cs b/src/Generator.DomainApi/Port/IDealSet.cs new file mode 100644 index 0000000..ee926ee --- /dev/null +++ b/src/Generator.DomainApi/Port/IDealSet.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Generator.DomainApi.Model; + +namespace Generator.DomainApi.Port +{ + public interface IDealSet + { + void AddRange(List getDeals); + void Add(Deal deal); + void Remove(Deal deal); + T Find(int id) where T : Deal; + List ToList() where T : Deal; + } +} \ No newline at end of file diff --git a/src/Generator.Persistence.Adapter/Context/ApplicationDbContext.cs b/src/Generator.Persistence.Adapter/Context/ApplicationDbContext.cs index 1f5682b..7b231e6 100644 --- a/src/Generator.Persistence.Adapter/Context/ApplicationDbContext.cs +++ b/src/Generator.Persistence.Adapter/Context/ApplicationDbContext.cs @@ -1,20 +1,30 @@ using Generator.DomainApi.Model; +using Generator.DomainApi.Port; using Microsoft.EntityFrameworkCore; using System.Threading; using System.Threading.Tasks; namespace Generator.Persistence.Adapter.Context { - public class ApplicationDbContext : DbContext + public class ApplicationDbContext : DbContext, IApplicationDbContext { public ApplicationDbContext() { } + public ApplicationDbContext(DbContextOptions options) : base(options) { } - public DbSet Deals { get; set; } + public DbSet DbDeals { get; set; } + + private IDealSet _deals; + + public IDealSet Deals + { + get { return _deals ??= new DealSet(Set()); } + set => _deals = value; + } public override Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { diff --git a/src/Generator.Persistence.Adapter/Context/DealSet.cs b/src/Generator.Persistence.Adapter/Context/DealSet.cs new file mode 100644 index 0000000..3ba2d6d --- /dev/null +++ b/src/Generator.Persistence.Adapter/Context/DealSet.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using Generator.DomainApi.Model; +using Generator.DomainApi.Port; +using Microsoft.EntityFrameworkCore; + +namespace Generator.Persistence.Adapter.Context +{ + public class DealSet: IDealSet + { + private readonly DbSet _dealDbSet; + + public DealSet(DbSet dealDbSet) + { + _dealDbSet = dealDbSet; + } + + public void AddRange(List deals) + { + _dealDbSet.AddRange(deals); + } + + public void Add(Deal deal) + { + _dealDbSet.Add(deal); + } + + public void Remove(Deal deal) + { + _dealDbSet.Remove(deal); + } + + public T Find(int id) where T : Deal + { + return _dealDbSet.Find(id) as T; + } + + public List ToList() where T : Deal + { + return _dealDbSet.ToList() as List; + } + } +} \ No newline at end of file diff --git a/src/Generator.Persistence.Adapter/PersistenceExtensions.cs b/src/Generator.Persistence.Adapter/PersistenceExtensions.cs index 212c2e4..70544bf 100644 --- a/src/Generator.Persistence.Adapter/PersistenceExtensions.cs +++ b/src/Generator.Persistence.Adapter/PersistenceExtensions.cs @@ -1,4 +1,5 @@ -using Generator.Persistence.Adapter.Context; +using Generator.DomainApi.Port; +using Generator.Persistence.Adapter.Context; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +11,8 @@ public static void AddPersistence(this IServiceCollection serviceCollection) { serviceCollection.AddDbContext(options => options.UseInMemoryDatabase("HexaArchConnInMemoryDb")); + + serviceCollection.AddScoped(); } } } From 17be79ae8d03b14f8a0cf1bc2a7a369a1a553696 Mon Sep 17 00:00:00 2001 From: Innok Mikhalev Date: Thu, 9 Dec 2021 15:55:11 +1300 Subject: [PATCH 3/4] refactor: remove reference; --- src/Generator.Domain/Generator.Domain.csproj | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Generator.Domain/Generator.Domain.csproj b/src/Generator.Domain/Generator.Domain.csproj index 9733fd1..90e8aa8 100644 --- a/src/Generator.Domain/Generator.Domain.csproj +++ b/src/Generator.Domain/Generator.Domain.csproj @@ -1,16 +1,15 @@ - - net5.0 - + + net5.0 + - - - + + + - - - - + + + From cd1b22dbda1e7111cae73ed586f925853eb816c5 Mon Sep 17 00:00:00 2001 From: Innok Mikhalev Date: Thu, 9 Dec 2021 15:57:32 +1300 Subject: [PATCH 4/4] remove duplicated ApplicationDbContextFactory; --- .../Common/ApplicationDbContextFactory.cs | 39 ------------------- .../Context/ApplicationDbContextTest.cs | 2 +- 2 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 src/Generator.Persistence.Adapter.UnitTest/Common/ApplicationDbContextFactory.cs diff --git a/src/Generator.Persistence.Adapter.UnitTest/Common/ApplicationDbContextFactory.cs b/src/Generator.Persistence.Adapter.UnitTest/Common/ApplicationDbContextFactory.cs deleted file mode 100644 index 9241d37..0000000 --- a/src/Generator.Persistence.Adapter.UnitTest/Common/ApplicationDbContextFactory.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Generator.DomainApi.Model; -using Generator.Persistence.Adapter.Context; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; - -namespace Generator.Persistence.Adapter.UnitTest.Common -{ - public static class ApplicationDbContextFactory - { - public static List GetDeals() - { - return new List() - { - new Deal(){Id=1, Name="ABC", Description="ABC deal 123"}, - new Deal(){Id=2, Name="ABC", Description="ABC deal 456"}, - new Deal(){Id=3, Name="ABC", Description="ABC deal 789"}, - }; - } - - public static ApplicationDbContext Create() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .Options; - - var context = new ApplicationDbContext(options); - context.Database.EnsureCreated(); - context.Deals.AddRange(GetDeals()); - context.SaveChanges(); - return context; - } - public static void Destroy(ApplicationDbContext dbContext) - { - dbContext.Database.EnsureDeleted(); - dbContext.Dispose(); - } - } -} diff --git a/src/Generator.Persistence.Adapter.UnitTest/Context/ApplicationDbContextTest.cs b/src/Generator.Persistence.Adapter.UnitTest/Context/ApplicationDbContextTest.cs index 0671266..67e3e57 100644 --- a/src/Generator.Persistence.Adapter.UnitTest/Context/ApplicationDbContextTest.cs +++ b/src/Generator.Persistence.Adapter.UnitTest/Context/ApplicationDbContextTest.cs @@ -1,5 +1,5 @@ using Generator.DomainApi.Model; -using Generator.Persistence.Adapter.UnitTest.Common; +using Generator.Persistence.Adapter.Common; using Microsoft.EntityFrameworkCore; using NUnit.Framework; using System.Threading.Tasks;