From 085cf3e6c080421fb738c5a29fcfc52f0c21781c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 22 Dec 2020 17:04:18 +0300 Subject: [PATCH] Implemented test app with the ABP Framework. --- .../AbpPerfTest.WithAbp.csproj | 10 ++- .../AbpPerfTest.WithAbp/AppModule.cs | 18 +++- .../Controllers/BookController.cs | 86 +++++++++++++++++++ .../AbpPerfTest.WithAbp/Dtos/BookDto.cs | 15 ++++ .../Dtos/CreateUpdateBookDto.cs | 11 +++ .../AbpPerfTest.WithAbp/Entities/Book.cs | 19 ++++ .../EntityFramework/BookDbContext.cs | 28 ++++++ .../EntityFramework/BookDbContextFactory.cs | 29 +++++++ .../20201222135738_Added_Books.Designer.cs | 48 +++++++++++ .../Migrations/20201222135738_Added_Books.cs | 31 +++++++ .../Migrations/BookDbContextModelSnapshot.cs | 46 ++++++++++ .../AbpPerfTest.WithAbp/appsettings.json | 5 +- .../AbpPerfTest.WithoutAbp.csproj | 10 +-- .../Controllers/BookController.cs | 1 - .../AbpPerfTest.WithoutAbp/Entities/Book.cs | 5 ++ 15 files changed, 351 insertions(+), 11 deletions(-) create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs create mode 100644 test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj index 41f8686caf..69e9c3802f 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj @@ -5,9 +5,13 @@ - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs index 9c3de2cecf..a1accb54d9 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs @@ -1,8 +1,11 @@ -using Microsoft.AspNetCore.Builder; +using AbpPerfTest.WithAbp.EntityFramework; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; +using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.Modularity; @@ -15,6 +18,19 @@ namespace AbpPerfTest.WithAbp )] public class AppModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(); + }); + + Configure(options => + { + options.UseSqlServer(); + }); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs new file mode 100644 index 0000000000..ed7bdb6a4d --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AbpPerfTest.WithAbp.Dtos; +using AbpPerfTest.WithAbp.Entities; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Domain.Repositories; + +namespace AbpPerfTest.WithAbp.Controllers +{ + [Route("api/books")] + public class BookController : Controller + { + private readonly IRepository _bookRepository; + + public BookController(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + [HttpGet] + public async Task> GetListAsync() + { + var books = await _bookRepository.GetListAsync(); + + return books + .Select(b => new BookDto + { + Id = b.Id, + Name = b.Name, + Price = b.Price, + IsAvailable = b.IsAvailable + }) + .ToList(); + } + + [HttpGet] + [Route("{id}")] + public async Task GetAsync(Guid id) + { + var book = await _bookRepository.GetAsync(id); + + return new BookDto + { + Id = book.Id, + Name = book.Name, + Price = book.Price, + IsAvailable = book.IsAvailable + }; + } + + [HttpPost] + public async Task CreateAsync(CreateUpdateBookDto input) + { + var book = new Book + { + Name = input.Name, + Price = input.Price, + IsAvailable = input.IsAvailable + }; + + await _bookRepository.InsertAsync(book); + + return book.Id; + } + + [HttpPut] + [Route("{id}")] + public async Task UpdateAsync(Guid id, CreateUpdateBookDto input) + { + var book = await _bookRepository.GetAsync(id); + + book.Name = input.Name; + book.Price = input.Price; + book.IsAvailable = input.IsAvailable; + } + + [HttpDelete] + [Route("{id}")] + public async Task DeleteAsync(Guid id) + { + await _bookRepository.DeleteAsync(id); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs new file mode 100644 index 0000000000..158fc86b52 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs @@ -0,0 +1,15 @@ +using System; + +namespace AbpPerfTest.WithAbp.Dtos +{ + public class BookDto + { + public Guid Id { get; set; } + + public string Name { get; set; } + + public float Price { get; set; } + + public bool IsAvailable { get; set; } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs new file mode 100644 index 0000000000..fa3aa996f6 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs @@ -0,0 +1,11 @@ +namespace AbpPerfTest.WithAbp.Dtos +{ + public class CreateUpdateBookDto + { + public string Name { get; set; } + + public float Price { get; set; } + + public bool IsAvailable { get; set; } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs new file mode 100644 index 0000000000..75a94d7271 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs @@ -0,0 +1,19 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace AbpPerfTest.WithAbp.Entities +{ + public class Book : BasicAggregateRoot + { + public string Name { get; set; } + + public float Price { get; set; } + + public bool IsAvailable { get; set; } + + public Book() + { + Id = Guid.NewGuid(); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs new file mode 100644 index 0000000000..02e5f788cf --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs @@ -0,0 +1,28 @@ +using AbpPerfTest.WithAbp.Entities; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace AbpPerfTest.WithAbp.EntityFramework +{ + public class BookDbContext : AbpDbContext + { + public DbSet Books { get; set; } + + public BookDbContext(DbContextOptions builderOptions) + : base(builderOptions) + { + + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(b => + { + b.ToTable("Books"); + b.Property(x => x.Name).HasMaxLength(128); + }); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs new file mode 100644 index 0000000000..b50975b8c2 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs @@ -0,0 +1,29 @@ +using System.IO; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace AbpPerfTest.WithAbp.EntityFramework +{ + public class BookDbContextFactory : IDesignTimeDbContextFactory + { + public BookDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); + + return new BookDbContext(builder.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs new file mode 100644 index 0000000000..f8b3db4d21 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs @@ -0,0 +1,48 @@ +// +using System; +using AbpPerfTest.WithAbp.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +namespace AbpPerfTest.WithAbp.Migrations +{ + [DbContext(typeof(BookDbContext))] + [Migration("20201222135738_Added_Books")] + partial class Added_Books + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("IsAvailable") + .HasColumnType("bit"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.HasKey("Id"); + + b.ToTable("Books"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs new file mode 100644 index 0000000000..f61374b9dc --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AbpPerfTest.WithAbp.Migrations +{ + public partial class Added_Books : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Books", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Price = table.Column(type: "real", nullable: false), + IsAvailable = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Books", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Books"); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs new file mode 100644 index 0000000000..8987a178df --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs @@ -0,0 +1,46 @@ +// +using System; +using AbpPerfTest.WithAbp.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +namespace AbpPerfTest.WithAbp.Migrations +{ + [DbContext(typeof(BookDbContext))] + partial class BookDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("IsAvailable") + .HasColumnType("bit"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Price") + .HasColumnType("real"); + + b.HasKey("Id"); + + b.ToTable("Books"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json index d9d9a9bff6..9cd22c72c3 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json @@ -6,5 +6,8 @@ "Microsoft.Hosting.Lifetime": "Information" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithAbp;Trusted_Connection=True;MultipleActiveResultSets=true" + } } diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj index edf2ed6d58..fd061fe040 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj @@ -5,11 +5,11 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs index 96cb30eedd..c7b5746bc7 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs @@ -56,7 +56,6 @@ namespace AbpPerfTest.WithoutAbp.Controllers { var book = new Book { - Id = Guid.NewGuid(), Name = input.Name, Price = input.Price, IsAvailable = input.IsAvailable diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs index 7a52830cf3..d33b5c309c 100644 --- a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs @@ -11,5 +11,10 @@ namespace AbpPerfTest.WithoutAbp.Entities public float Price { get; set; } public bool IsAvailable { get; set; } + + public Book() + { + Id = Guid.NewGuid(); + } } }