diff --git a/test/DistEvents/DistDemoApp/DistDemoAppModule.cs b/test/DistEvents/DistDemoApp/DistDemoAppModule.cs index a9b5b23dc7..14abd87b4c 100644 --- a/test/DistEvents/DistDemoApp/DistDemoAppModule.cs +++ b/test/DistEvents/DistDemoApp/DistDemoAppModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Autofac; +using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.Modularity; @@ -23,6 +24,12 @@ namespace DistDemoApp { options.UseSqlServer(); }); + + Configure(options => + { + options.EtoMappings.Add(); + options.AutoEventSelectors.Add(); + }); } } } \ No newline at end of file diff --git a/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.Designer.cs b/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.Designer.cs new file mode 100644 index 0000000000..4c2cf9abbb --- /dev/null +++ b/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.Designer.cs @@ -0,0 +1,95 @@ +// +using System; +using DistDemoApp; +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 DistDemoApp.Migrations +{ + [DbContext(typeof(TodoDbContext))] + [Migration("20210825112717_Added_Summary_Table")] + partial class Added_Summary_Table + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.9") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("DistDemoApp.TodoItem", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Text") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("TodoItems"); + }); + + modelBuilder.Entity("DistDemoApp.TodoSummary", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Day") + .HasColumnType("tinyint"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Month") + .HasColumnType("tinyint"); + + b.Property("TotalCount") + .HasColumnType("int"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("TodoSummaries"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.cs b/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.cs new file mode 100644 index 0000000000..7a7f167470 --- /dev/null +++ b/test/DistEvents/DistDemoApp/Migrations/20210825112717_Added_Summary_Table.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DistDemoApp.Migrations +{ + public partial class Added_Summary_Table : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "TodoSummaries", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Year = table.Column(type: "int", nullable: false), + Month = table.Column(type: "tinyint", nullable: false), + Day = table.Column(type: "tinyint", nullable: false), + TotalCount = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_TodoSummaries", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "TodoSummaries"); + } + } +} diff --git a/test/DistEvents/DistDemoApp/Migrations/TodoDbContextModelSnapshot.cs b/test/DistEvents/DistDemoApp/Migrations/TodoDbContextModelSnapshot.cs index c930e469f1..99f0f92ab7 100644 --- a/test/DistEvents/DistDemoApp/Migrations/TodoDbContextModelSnapshot.cs +++ b/test/DistEvents/DistDemoApp/Migrations/TodoDbContextModelSnapshot.cs @@ -53,6 +53,40 @@ namespace DistDemoApp.Migrations b.ToTable("TodoItems"); }); + + modelBuilder.Entity("DistDemoApp.TodoSummary", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Day") + .HasColumnType("tinyint"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Month") + .HasColumnType("tinyint"); + + b.Property("TotalCount") + .HasColumnType("int"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("TodoSummaries"); + }); #pragma warning restore 612, 618 } } diff --git a/test/DistEvents/DistDemoApp/Program.cs b/test/DistEvents/DistDemoApp/Program.cs index 230bef5982..bf60cac7e5 100644 --- a/test/DistEvents/DistDemoApp/Program.cs +++ b/test/DistEvents/DistDemoApp/Program.cs @@ -19,8 +19,8 @@ namespace DistDemoApp var demoService = application.ServiceProvider.GetRequiredService(); await demoService.CreateTodoItemAsync(); - //Console.WriteLine("Press ENTER to exit"); - //Console.ReadLine(); + Console.WriteLine("Press ENTER to exit"); + Console.ReadLine(); application.Shutdown(); } diff --git a/test/DistEvents/DistDemoApp/TodoDbContext.cs b/test/DistEvents/DistDemoApp/TodoDbContext.cs index 5963f7c6ca..000f18c802 100644 --- a/test/DistEvents/DistDemoApp/TodoDbContext.cs +++ b/test/DistEvents/DistDemoApp/TodoDbContext.cs @@ -7,6 +7,7 @@ namespace DistDemoApp public class TodoDbContext : AbpDbContext { public DbSet TodoItems { get; set; } + public DbSet TodoSummaries { get; set; } public TodoDbContext(DbContextOptions options) : base(options) diff --git a/test/DistEvents/DistDemoApp/TodoEventHandler.cs b/test/DistEvents/DistDemoApp/TodoEventHandler.cs new file mode 100644 index 0000000000..b48031aefd --- /dev/null +++ b/test/DistEvents/DistDemoApp/TodoEventHandler.cs @@ -0,0 +1,63 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Uow; + +namespace DistDemoApp +{ + public class TodoEventHandler : + IDistributedEventHandler>, + IDistributedEventHandler>, + ITransientDependency + { + private readonly IRepository _todoSummaryRepository; + + public TodoEventHandler(IRepository todoSummaryRepository) + { + _todoSummaryRepository = todoSummaryRepository; + } + + [UnitOfWork] + public virtual async Task HandleEventAsync(EntityCreatedEto eventData) + { + var dateTime = eventData.Entity.CreationTime; + var todoSummary = await _todoSummaryRepository.FindAsync( + x => x.Year == dateTime.Year && + x.Month == dateTime.Month && + x.Day == dateTime.Day + ); + + if (todoSummary == null) + { + await _todoSummaryRepository.InsertAsync(new TodoSummary(dateTime)); + } + else + { + todoSummary.Increase(); + await _todoSummaryRepository.UpdateAsync(todoSummary); + } + + Console.WriteLine("Increased total count: " + todoSummary); + } + + public async Task HandleEventAsync(EntityDeletedEto eventData) + { + var dateTime = eventData.Entity.CreationTime; + var todoSummary = await _todoSummaryRepository.FirstOrDefaultAsync( + x => x.Year == dateTime.Year && + x.Month == dateTime.Month && + x.Day == dateTime.Day + ); + + if (todoSummary != null) + { + todoSummary.Decrease(); + await _todoSummaryRepository.UpdateAsync(todoSummary); + Console.WriteLine("Decreased total count: " + todoSummary); + } + } + } +} \ No newline at end of file diff --git a/test/DistEvents/DistDemoApp/TodoItemEto.cs b/test/DistEvents/DistDemoApp/TodoItemEto.cs new file mode 100644 index 0000000000..d593a10347 --- /dev/null +++ b/test/DistEvents/DistDemoApp/TodoItemEto.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.EventBus; + +namespace DistDemoApp +{ + [EventName("todo-item")] + public class TodoItemEto + { + public DateTime CreationTime { get; set; } + public string Text { get; set; } + } +} \ No newline at end of file diff --git a/test/DistEvents/DistDemoApp/TodoItemObjectMapper.cs b/test/DistEvents/DistDemoApp/TodoItemObjectMapper.cs new file mode 100644 index 0000000000..167c8e114f --- /dev/null +++ b/test/DistEvents/DistDemoApp/TodoItemObjectMapper.cs @@ -0,0 +1,24 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.ObjectMapping; + +namespace DistDemoApp +{ + public class TodoItemObjectMapper : IObjectMapper, ISingletonDependency + { + public TodoItemEto Map(TodoItem source) + { + return new TodoItemEto + { + Text = source.Text, + CreationTime = source.CreationTime + }; + } + + public TodoItemEto Map(TodoItem source, TodoItemEto destination) + { + destination.Text = source.Text; + destination.CreationTime = source.CreationTime; + return destination; + } + } +} \ No newline at end of file diff --git a/test/DistEvents/DistDemoApp/TodoSummary.cs b/test/DistEvents/DistDemoApp/TodoSummary.cs new file mode 100644 index 0000000000..b0e3b395c2 --- /dev/null +++ b/test/DistEvents/DistDemoApp/TodoSummary.cs @@ -0,0 +1,41 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace DistDemoApp +{ + public class TodoSummary : AggregateRoot + { + public int Year { get; private set; } + public byte Month { get; private set; } + public byte Day { get; private set; } + public int TotalCount { get; private set; } + + private TodoSummary() + { + + } + + public TodoSummary(DateTime dateTime, int initialCount = 1) + { + Year = dateTime.Year; + Month = (byte)dateTime.Month; + Day = (byte)dateTime.Day; + TotalCount = initialCount; + } + + public void Increase(int amount = 1) + { + TotalCount += amount; + } + + public void Decrease(int amount = 1) + { + TotalCount -= amount; + } + + public override string ToString() + { + return $"{base.ToString()}, {Year}-{Month:2}-{Day:2}: {TotalCount}"; + } + } +} \ No newline at end of file