diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj new file mode 100644 index 0000000000..69e9c3802f --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs new file mode 100644 index 0000000000..1cd88989e6 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs @@ -0,0 +1,55 @@ +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; +using Volo.Abp.Uow; + +namespace AbpPerfTest.WithAbp +{ + [DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(AbpAutofacModule), + typeof(AbpEntityFrameworkCoreSqlServerModule) + )] + public class AppModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(); + }); + + Configure(options => + { + options.UseSqlServer(); + }); + + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseConfiguredEndpoints(); + } + } +} 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/Program.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Program.cs new file mode 100644 index 0000000000..37b8418e62 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Program.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace AbpPerfTest.WithAbp +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }) + .UseAutofac(); + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json new file mode 100644 index 0000000000..a5d1af3797 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:50732", + "sslPort": 44312 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "AbpPerfTest.WithAbp": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs new file mode 100644 index 0000000000..55d22b7dca --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace AbpPerfTest.WithAbp +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json new file mode 100644 index 0000000000..8983e0fc1c --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json new file mode 100644 index 0000000000..9cd22c72c3 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json @@ -0,0 +1,13 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "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 new file mode 100644 index 0000000000..fd061fe040 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj @@ -0,0 +1,15 @@ + + + + net5.0 + + + + + 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 new file mode 100644 index 0000000000..c7b5746bc7 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AbpPerfTest.WithoutAbp.Dtos; +using AbpPerfTest.WithoutAbp.Entities; +using AbpPerfTest.WithoutAbp.EntityFramework; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace AbpPerfTest.WithoutAbp.Controllers +{ + [Route("api/books")] + public class BookController : Controller + { + private readonly BookDbContext _bookDbContext; + + public BookController(BookDbContext bookDbContext) + { + _bookDbContext = bookDbContext; + } + + [HttpGet] + public async Task> GetListAsync() + { + var books = await _bookDbContext.Books.ToListAsync(); + + 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 _bookDbContext.Books.SingleAsync(b => b.Id == 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 _bookDbContext.Books.AddAsync(book); + await _bookDbContext.SaveChangesAsync(); + + return book.Id; + } + + [HttpPut] + [Route("{id}")] + public async Task UpdateAsync(Guid id, CreateUpdateBookDto input) + { + var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id); + + book.Name = input.Name; + book.Price = input.Price; + book.IsAvailable = input.IsAvailable; + + await _bookDbContext.SaveChangesAsync(); + } + + [HttpDelete] + [Route("{id}")] + public async Task DeleteAsync(Guid id) + { + var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id); + + _bookDbContext.Books.Remove(book); + await _bookDbContext.SaveChangesAsync(); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs new file mode 100644 index 0000000000..46ab9599dc --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs @@ -0,0 +1,15 @@ +using System; + +namespace AbpPerfTest.WithoutAbp.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.WithoutAbp/Dtos/CreateUpdateBookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/CreateUpdateBookDto.cs new file mode 100644 index 0000000000..f5af124a65 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/CreateUpdateBookDto.cs @@ -0,0 +1,11 @@ +namespace AbpPerfTest.WithoutAbp.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.WithoutAbp/Entities/Book.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs new file mode 100644 index 0000000000..d33b5c309c --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs @@ -0,0 +1,20 @@ +using System; + +namespace AbpPerfTest.WithoutAbp.Entities +{ + public class Book + { + public Guid Id { get; set; } + + 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.WithoutAbp/EntityFramework/BookDbContext.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContext.cs new file mode 100644 index 0000000000..92c5dc1cc1 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContext.cs @@ -0,0 +1,27 @@ +using AbpPerfTest.WithoutAbp.Entities; +using Microsoft.EntityFrameworkCore; + +namespace AbpPerfTest.WithoutAbp.EntityFramework +{ + public class BookDbContext : DbContext + { + 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.WithoutAbp/EntityFramework/BookDbContextFactory.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContextFactory.cs new file mode 100644 index 0000000000..d92948fcbc --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContextFactory.cs @@ -0,0 +1,29 @@ +using System.IO; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace AbpPerfTest.WithoutAbp.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.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs new file mode 100644 index 0000000000..0fc7fef909 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs @@ -0,0 +1,47 @@ +// +using System; +using AbpPerfTest.WithoutAbp.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace AbpPerfTest.WithoutAbp.Migrations +{ + [DbContext(typeof(BookDbContext))] + [Migration("20201222132615_Added_Books")] + partial class Added_Books + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .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.WithoutAbp/Migrations/20201222132615_Added_Books.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.cs new file mode 100644 index 0000000000..cb5103c93c --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AbpPerfTest.WithoutAbp.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.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs new file mode 100644 index 0000000000..9d494bb518 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs @@ -0,0 +1,45 @@ +// +using System; +using AbpPerfTest.WithoutAbp.EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace AbpPerfTest.WithoutAbp.Migrations +{ + [DbContext(typeof(BookDbContext))] + partial class BookDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .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.WithoutAbp/Program.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Program.cs new file mode 100644 index 0000000000..b657f16862 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Program.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace AbpPerfTest.WithoutAbp +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json new file mode 100644 index 0000000000..74f1d25f0e --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:16268", + "sslPort": 44323 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "AbpPerfTest.WithoutAbp": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "applicationUrl": "https://localhost:5003;http://localhost:5002", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs new file mode 100644 index 0000000000..cf2a61df14 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs @@ -0,0 +1,45 @@ +using AbpPerfTest.WithoutAbp.EntityFramework; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace AbpPerfTest.WithoutAbp +{ + public class Startup + { + private readonly IConfiguration _configuration; + + public Startup(IConfiguration configuration) + { + _configuration = configuration; + } + + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc(); + + services.AddDbContext(options => + { + options.UseSqlServer(_configuration.GetConnectionString("Default")); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json new file mode 100644 index 0000000000..8983e0fc1c --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json new file mode 100644 index 0000000000..7f6ca466b2 --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json @@ -0,0 +1,13 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithoutAbp;Trusted_Connection=True;MultipleActiveResultSets=true" + } +} diff --git a/test/AbpPerfTest/AbpPerfTest.sln b/test/AbpPerfTest/AbpPerfTest.sln new file mode 100644 index 0000000000..b8baba19de --- /dev/null +++ b/test/AbpPerfTest/AbpPerfTest.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithoutAbp", "AbpPerfTest.WithoutAbp\AbpPerfTest.WithoutAbp.csproj", "{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithAbp", "AbpPerfTest.WithAbp\AbpPerfTest.WithAbp.csproj", "{13021286-B5D8-4A3E-8F36-5256D32638A7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.Build.0 = Release|Any CPU + {13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal