diff --git a/samples/apis/Product.Api/Application/Command/AddProductTypeCommand.cs b/samples/apis/Product.Api/Application/Command/AddProductTypeCommand.cs index b64b045..9647a16 100644 --- a/samples/apis/Product.Api/Application/Command/AddProductTypeCommand.cs +++ b/samples/apis/Product.Api/Application/Command/AddProductTypeCommand.cs @@ -1,4 +1,5 @@ -using Pole.Application.Cqrs; +using Pole.Application.Command; +using Pole.Application.Cqrs; using Pole.Grpc.ExtraType; using PoleSample.Apis.Product; using System; diff --git a/samples/apis/Product.Api/Application/Command/CommandHandler/AddProductTypeCommandHandler.cs b/samples/apis/Product.Api/Application/Command/CommandHandler/AddProductTypeCommandHandler.cs index a80b6f8..c23894d 100644 --- a/samples/apis/Product.Api/Application/Command/CommandHandler/AddProductTypeCommandHandler.cs +++ b/samples/apis/Product.Api/Application/Command/CommandHandler/AddProductTypeCommandHandler.cs @@ -1,5 +1,7 @@ using NewArchitectureLab.Apps.Product; +using Pole.Application.Command; using Pole.Application.Cqrs; +using Pole.Domain.UnitOfWork; using Pole.Grpc.ExtraType; using PoleSample.Apis.Product; using Product.Api.Domain.Event; @@ -15,9 +17,11 @@ namespace Product.Api.Application.Command.CommandHandler public class AddProductTypeCommandHandler : ICommandHandler { private readonly IProductTypeRepository _productTypeRepository; - public AddProductTypeCommandHandler(IProductTypeRepository productTypeRepository) + private readonly IUnitOfWorkManager _unitOfWorkManager; + public AddProductTypeCommandHandler(IProductTypeRepository productTypeRepository, IUnitOfWorkManager unitOfWorkManager) { _productTypeRepository = productTypeRepository; + _unitOfWorkManager = unitOfWorkManager; } public async Task Handle(AddProductTypeCommand request, CancellationToken cancellationToken) { @@ -30,9 +34,14 @@ namespace Product.Api.Application.Command.CommandHandler ProductTypeId = productType.Id, ProductTypeName = productType.Name }; - productType.AddDomainEvent(productTypeAddedDomainEvent); - var result= await _productTypeRepository.UnitOfWork.CompeleteAsync(); - return result; + using(var unitOfWork= await _unitOfWorkManager.BeginUnitOfWork()) + { + productType.AddDomainEvent(productTypeAddedDomainEvent); + var result = await _productTypeRepository.SaveEntitiesAsync(); + + await unitOfWork.CompeleteAsync(); + return CommonCommandResponse.SuccessResponse; + } } } } diff --git a/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAdded2DomainEventHandler.cs b/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAdded2DomainEventHandler.cs index 80832f5..d1cb775 100644 --- a/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAdded2DomainEventHandler.cs +++ b/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAdded2DomainEventHandler.cs @@ -21,7 +21,7 @@ namespace Product.Api.Application.DomainEventHandler { Product.Api.Domain.ProductAggregate.Product product = new Product.Api.Domain.ProductAggregate.Product(Guid.NewGuid().ToString("N"), request.ProductTypeName, 100, request.ProductTypeId); _productRepository.Add(product); - await _productRepository.UnitOfWork.CompeleteAsync(); + await _productRepository.SaveEntitiesAsync(); } } } diff --git a/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAddedDomainEventHandler.cs b/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAddedDomainEventHandler.cs index 697ded7..e2f6e73 100644 --- a/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAddedDomainEventHandler.cs +++ b/samples/apis/Product.Api/Application/DomainEventHandler/AddDefaultProductWhenProductTypeAddedDomainEventHandler.cs @@ -21,7 +21,7 @@ namespace Product.Api.Application.DomainEventHandler { Product.Api.Domain.ProductAggregate.Product product = new Product.Api.Domain.ProductAggregate.Product(Guid.NewGuid().ToString("N"), request.ProductTypeName, 100, request.ProductTypeId); _productRepository.Add(product); - await _productRepository.UnitOfWork.CompeleteAsync(); + await _productRepository.SaveEntitiesAsync(); } } } diff --git a/samples/apis/Product.Api/Grpc/ProductTypeService.cs b/samples/apis/Product.Api/Grpc/ProductTypeService.cs index bcdc62e..37fbd16 100644 --- a/samples/apis/Product.Api/Grpc/ProductTypeService.cs +++ b/samples/apis/Product.Api/Grpc/ProductTypeService.cs @@ -1,9 +1,11 @@ using Grpc.Core; using NewArchitectureLab.Apps.Product; +using Pole.Application.Command; using Pole.Application.Cqrs; using Pole.Grpc.ExtraType; using PoleSample.Apis.Product; using Product.Api.Application.Command; +using Product.Api.Infrastructure; using System; using System.Collections.Generic; using System.Linq; diff --git a/samples/apis/Product.Api/Infrastructure/ProductDbContext.cs b/samples/apis/Product.Api/Infrastructure/ProductDbContext.cs index 95467bb..4d98704 100644 --- a/samples/apis/Product.Api/Infrastructure/ProductDbContext.cs +++ b/samples/apis/Product.Api/Infrastructure/ProductDbContext.cs @@ -9,11 +9,11 @@ using System.Threading.Tasks; namespace Product.Api.Infrastructure { - public class ProductDbContext : DbContextBase + public class ProductDbContext : DbContext { public DbSet Products { get; set; } public DbSet ProductTypes { get; set; } - public ProductDbContext(DbContextOptions options, IMediator mediator) : base(options, mediator) + public ProductDbContext(DbContextOptions options) : base(options) { } diff --git a/samples/apis/Product.Api/Infrastructure/Repository/ProductRepository.cs b/samples/apis/Product.Api/Infrastructure/Repository/ProductRepository.cs index af6cde3..ef852f1 100644 --- a/samples/apis/Product.Api/Infrastructure/Repository/ProductRepository.cs +++ b/samples/apis/Product.Api/Infrastructure/Repository/ProductRepository.cs @@ -1,4 +1,5 @@ -using Pole.Domain.UnitOfWork; +using Pole.Domain.EntityframeworkCore; +using Pole.Domain.UnitOfWork; using Product.Api.Domain.ProductAggregate; using System; using System.Collections.Generic; @@ -7,35 +8,11 @@ using System.Threading.Tasks; namespace Product.Api.Infrastructure.Repository { - public class ProductRepository : IProductRepository + public class ProductRepository : EFCoreRepository, IProductRepository { - private readonly ProductDbContext _productDbContext; - - public ProductRepository(ProductDbContext productDbContext) + public ProductRepository(IServiceProvider serviceProvider) : base(serviceProvider) { - _productDbContext = productDbContext; - } - public IUnitOfWork UnitOfWork => _productDbContext; - - public void Add(Domain.ProductAggregate.Product entity) - { - _productDbContext.Products.Add(entity); - } - - public void Delete(Domain.ProductAggregate.Product entity) - { - throw new NotImplementedException(); - } - - public Task Get(string id) - { - throw new NotImplementedException(); - } - - public void Update(Domain.ProductAggregate.Product entity) - { - throw new NotImplementedException(); } } } diff --git a/samples/apis/Product.Api/Infrastructure/Repository/ProductTypeRepository.cs b/samples/apis/Product.Api/Infrastructure/Repository/ProductTypeRepository.cs index 5c945d5..99d517f 100644 --- a/samples/apis/Product.Api/Infrastructure/Repository/ProductTypeRepository.cs +++ b/samples/apis/Product.Api/Infrastructure/Repository/ProductTypeRepository.cs @@ -1,4 +1,5 @@ -using Pole.Domain.UnitOfWork; +using Pole.Domain.EntityframeworkCore; +using Pole.Domain.UnitOfWork; using Product.Api.Domain.ProductTypeAggregate; using System; using System.Collections.Generic; @@ -7,34 +8,10 @@ using System.Threading.Tasks; namespace Product.Api.Infrastructure.Repository { - public class ProductTypeRepository : IProductTypeRepository + public class ProductTypeRepository : EFCoreRepository, IProductTypeRepository { - private readonly ProductDbContext _productDbContext; - - public ProductTypeRepository(ProductDbContext productDbContext) - { - _productDbContext = productDbContext; - } - public IUnitOfWork UnitOfWork => _productDbContext; - - public void Add(ProductType entity) - { - _productDbContext.ProductTypes.Add(entity); - } - - public void Delete(ProductType entity) - { - throw new NotImplementedException(); - } - - public Task Get(string id) - { - throw new NotImplementedException(); - } - - public void Update(ProductType entity) + public ProductTypeRepository(IServiceProvider serviceProvider) : base(serviceProvider) { - throw new NotImplementedException(); } } } diff --git a/samples/apis/Product.Api/ProductDbContextDesignFactory.cs b/samples/apis/Product.Api/ProductDbContextDesignFactory.cs index 038eadb..1aa4bc2 100644 --- a/samples/apis/Product.Api/ProductDbContextDesignFactory.cs +++ b/samples/apis/Product.Api/ProductDbContextDesignFactory.cs @@ -22,9 +22,7 @@ namespace Product.Api var optionsBuilder = new DbContextOptionsBuilder() .UseNpgsql(configuration["postgres:main"]); - return new ProductDbContext(optionsBuilder.Options, new NoMediator()); + return new ProductDbContext(optionsBuilder.Options); } - - } } diff --git a/samples/apis/Product.Api/Startup.cs b/samples/apis/Product.Api/Startup.cs index 6d675f9..da48a48 100644 --- a/samples/apis/Product.Api/Startup.cs +++ b/samples/apis/Product.Api/Startup.cs @@ -28,17 +28,27 @@ namespace Product.Api // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { - services.AddDbContext(options => + services.AddDbContext(options => options.UseNpgsql(Configuration["postgres:main"])); - services.AddGrpc(option=> { + services.AddGrpc(option => + { if (Environment.IsDevelopment()) { option.EnableDetailedErrors = true; } }); - services.AddPoleGrpc(this.GetType().Assembly); + services.AddGrpcValidation(); + services.AddGrpcRequestValidator(this.GetType().Assembly); + + services.AddPole(option => + { + option.AddManageredAssemblies(this.GetType().Assembly); + option.AutoInjectionDependency(); + option.AutoInjectionCommandHandlersAndDomainEventHandlers(); + option.AddPoleEntityFrameworkCoreDomain(); + }); services.AddPoleReliableMessage(option => { diff --git a/src/Pole.Application/Cqrs/ICommand.cs b/src/Pole.Application/Command/ICommand.cs similarity index 90% rename from src/Pole.Application/Cqrs/ICommand.cs rename to src/Pole.Application/Command/ICommand.cs index c267214..b761074 100644 --- a/src/Pole.Application/Cqrs/ICommand.cs +++ b/src/Pole.Application/Command/ICommand.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Text; -namespace Pole.Application.Cqrs +namespace Pole.Application.Command { public interface ICommand:IRequest { diff --git a/src/Pole.Application/Cqrs/ICommandBus.cs b/src/Pole.Application/Command/ICommandBus.cs similarity index 93% rename from src/Pole.Application/Cqrs/ICommandBus.cs rename to src/Pole.Application/Command/ICommandBus.cs index 4d531d9..700e5f2 100644 --- a/src/Pole.Application/Cqrs/ICommandBus.cs +++ b/src/Pole.Application/Command/ICommandBus.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Pole.Application.Cqrs +namespace Pole.Application.Command { public interface ICommandBus { diff --git a/src/Pole.Application/Cqrs/ICommandHandler.cs b/src/Pole.Application/Command/ICommandHandler.cs similarity index 90% rename from src/Pole.Application/Cqrs/ICommandHandler.cs rename to src/Pole.Application/Command/ICommandHandler.cs index 80aeb7f..12b9b0b 100644 --- a/src/Pole.Application/Cqrs/ICommandHandler.cs +++ b/src/Pole.Application/Command/ICommandHandler.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Text; -namespace Pole.Application.Cqrs +namespace Pole.Application.Command { public interface ICommandHandler: IRequestHandler where TCommand : ICommand { diff --git a/src/Pole.Application/Cqrs/Internal/DefaultCommandBus.cs b/src/Pole.Application/Command/Internal/DefaultCommandBus.cs similarity index 98% rename from src/Pole.Application/Cqrs/Internal/DefaultCommandBus.cs rename to src/Pole.Application/Command/Internal/DefaultCommandBus.cs index 74acfeb..04fb69b 100644 --- a/src/Pole.Application/Cqrs/Internal/DefaultCommandBus.cs +++ b/src/Pole.Application/Command/Internal/DefaultCommandBus.cs @@ -4,6 +4,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using MediatR; +using Pole.Application.Command; namespace Pole.Application.Cqrs.Internal { diff --git a/src/Pole.Application/PoleApplicationOptions.cs b/src/Pole.Application/PoleOptions.cs similarity index 77% rename from src/Pole.Application/PoleApplicationOptions.cs rename to src/Pole.Application/PoleOptions.cs index f2ed52d..c8bf5d1 100644 --- a/src/Pole.Application/PoleApplicationOptions.cs +++ b/src/Pole.Application/PoleOptions.cs @@ -6,14 +6,13 @@ using System.Text; namespace Pole.Application { - public class PoleApplicationOptions + public class PoleOptions { - public PoleApplicationOptions(IServiceCollection services, params Assembly [] applicationAssemblies) + public PoleOptions(IServiceCollection services) { Services = services; - ApplicationAssemblies = applicationAssemblies; } - public IServiceCollection Services { get; set; } + public IServiceCollection Services { get;private set; } public IEnumerable ApplicationAssemblies { get; set; } } diff --git a/src/Pole.Application/PoleApplicationOptionsExtensions.cs b/src/Pole.Application/PoleOptionsExtensions.cs similarity index 55% rename from src/Pole.Application/PoleApplicationOptionsExtensions.cs rename to src/Pole.Application/PoleOptionsExtensions.cs index 1bc3c4d..4388c49 100644 --- a/src/Pole.Application/PoleApplicationOptionsExtensions.cs +++ b/src/Pole.Application/PoleOptionsExtensions.cs @@ -1,5 +1,6 @@ using MediatR; using Microsoft.Extensions.DependencyInjection; +using Pole.Application; using Pole.Application.Cqrs; using Pole.Application.MediatR; using Pole.Core.DependencyInjection; @@ -9,11 +10,16 @@ using System.Linq; using System.Reflection; using System.Text; -namespace Pole.Application +namespace Microsoft.Extensions.DependencyInjection { - public static class PoleApplicationOptionsExtensions + public static class PoleOptionsExtensions { - public static PoleApplicationOptions AutoInjectionDependency(this PoleApplicationOptions options) + public static PoleOptions AddManageredAssemblies(this PoleOptions options, params Assembly [] assemblies) + { + options.ApplicationAssemblies = assemblies; + return options; + } + public static PoleOptions AutoInjectionDependency(this PoleOptions options) { var assemblies = options.ApplicationAssemblies; @@ -26,7 +32,7 @@ namespace Pole.Application return options; } - public static PoleApplicationOptions AutoInjectionCommandHandlersAndDomainEventHandlers(this PoleApplicationOptions options, ServiceLifetime lifetime = ServiceLifetime.Scoped) + public static PoleOptions AutoInjectionCommandHandlersAndDomainEventHandlers(this PoleOptions options, ServiceLifetime lifetime = ServiceLifetime.Scoped) { options.Services.AddMediatR(config => { @@ -35,35 +41,43 @@ namespace Pole.Application return options; } - private static void AddScoped(PoleApplicationOptions options, Assembly assembly) + private static void AddScoped(PoleOptions options, Assembly assembly) { - var queriesImplements = assembly.GetTypes().Where(m => typeof(IScopedDenpendency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); - foreach (var queriesImplement in queriesImplements) + var implements = assembly.GetTypes().Where(m => typeof(IScopedDenpendency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); + foreach (var implement in implements) { - var queriesService = queriesImplement.GetInterfaces().FirstOrDefault(); - options.Services.AddScoped(queriesService, queriesImplement); + var services = implement.GetInterfaces(); + foreach(var queriesService in services) + { + options.Services.AddScoped(queriesService, implement); + } } } - private static void AddTransient(PoleApplicationOptions options, Assembly assembly) + private static void AddTransient(PoleOptions options, Assembly assembly) { - var queriesImplements = assembly.GetTypes().Where(m => typeof(ITransientDependency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); - foreach (var queriesImplement in queriesImplements) + var implements = assembly.GetTypes().Where(m => typeof(ITransientDependency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); + foreach (var implement in implements) { - var queriesService = queriesImplement.GetInterfaces().FirstOrDefault(); - options.Services.AddTransient(queriesService, queriesImplement); + var services = implement.GetInterfaces(); + foreach (var queriesService in services) + { + options.Services.AddTransient(queriesService, implement); + } } } - private static void AddSingleton(PoleApplicationOptions options, Assembly assembly) + private static void AddSingleton(PoleOptions options, Assembly assembly) { - var queriesImplements = assembly.GetTypes().Where(m => typeof(ISingleDependency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); - foreach (var queriesImplement in queriesImplements) + var implements = assembly.GetTypes().Where(m => typeof(ISingleDependency).IsAssignableFrom(m) && m.IsClass && !m.IsAbstract); + foreach (var implement in implements) { - var queriesService = queriesImplement.GetInterfaces().FirstOrDefault(); - options.Services.AddSingleton(queriesService, queriesImplement); + var services = implement.GetInterfaces(); + foreach (var queriesService in services) + { + options.Services.AddSingleton(queriesService, implement); + } } } - } } diff --git a/src/Pole.Application/Cqrs/IQueries.cs b/src/Pole.Application/Query/IQueries.cs similarity index 90% rename from src/Pole.Application/Cqrs/IQueries.cs rename to src/Pole.Application/Query/IQueries.cs index 1cdf5c6..dd432fb 100644 --- a/src/Pole.Application/Cqrs/IQueries.cs +++ b/src/Pole.Application/Query/IQueries.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Text; -namespace Pole.Application.Cqrs +namespace Pole.Application.Query { public interface IQueries: IScopedDenpendency { diff --git a/src/Pole.Application/ServiceCollectionExtensions.cs b/src/Pole.Application/ServiceCollectionExtensions.cs index 9cf4d66..da6b124 100644 --- a/src/Pole.Application/ServiceCollectionExtensions.cs +++ b/src/Pole.Application/ServiceCollectionExtensions.cs @@ -5,17 +5,18 @@ using MediatR; using System.Reflection; using Pole.Application.Cqrs; using Pole.Application.Cqrs.Internal; -using Microsoft.Extensions.DependencyInjection; +using Pole.Application.Command; +using Pole.Application; -namespace Pole.Application +namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { - public static IServiceCollection AddPoleApplication(this IServiceCollection services, Action config, params Assembly[] assemblies) + public static IServiceCollection AddPole(this IServiceCollection services, Action config) { - PoleApplicationOptions poleApplicationOptions = new PoleApplicationOptions(services, assemblies); + PoleOptions poleOptions = new PoleOptions(services); - config(poleApplicationOptions); + config(poleOptions); services.AddScoped(); diff --git a/src/Pole.Domain.EntityframeworkCore/DbContextBase.cs b/src/Pole.Domain.EntityframeworkCore/DbContextBase.cs deleted file mode 100644 index 7dc42fe..0000000 --- a/src/Pole.Domain.EntityframeworkCore/DbContextBase.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MediatR; -using Microsoft.EntityFrameworkCore; -using Pole.Domain; -using Pole.Domain.UnitOfWork; -using Pole.EntityframeworkCore.MediatR; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace Pole.EntityframeworkCore -{ - public class DbContextBase : DbContext, IUnitOfWork - { - private readonly IMediator _mediator; - public DbContextBase(DbContextOptions options, IMediator mediator) : base(options) - { - _mediator = mediator; - } - - public async Task CompeleteAsync(CancellationToken cancellationToken = default) - { - var result = CompleteResult.SuccessResult; - - await _mediator.DispatchDomainEventsAsync(this); - await base.SaveChangesAsync(cancellationToken); - - return result; - } - } -} diff --git a/src/Pole.Domain.EntityframeworkCore/EFCoreRepository.cs b/src/Pole.Domain.EntityframeworkCore/EFCoreRepository.cs new file mode 100644 index 0000000..20773f7 --- /dev/null +++ b/src/Pole.Domain.EntityframeworkCore/EFCoreRepository.cs @@ -0,0 +1,51 @@ +using MediatR; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Pole.EntityframeworkCore.MediatR; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Pole.Domain.EntityframeworkCore +{ + public class EFCoreRepository : IRepository + where TEntity : Entity, IAggregateRoot + { + protected readonly DbContext _dbContext; + private readonly IMediator _mediator; + public EFCoreRepository(IServiceProvider serviceProvider) + { + var dbContextOptions = serviceProvider.GetRequiredService(); + _dbContext = serviceProvider.GetRequiredService(dbContextOptions.ContextType) as DbContext; + _mediator = serviceProvider.GetRequiredService(); + } + public void Add(TEntity entity) + { + _dbContext.Set().Add(entity); + } + + public void Delete(TEntity entity) + { + _dbContext.Set().Remove(entity); + } + + public virtual Task Get(string id) + { + return _dbContext.Set().FirstOrDefaultAsync(m => m.Id == id); + } + + public async Task SaveEntitiesAsync(CancellationToken cancellationToken = default) + { + await _mediator.DispatchDomainEventsAsync(_dbContext); + await _dbContext.SaveChangesAsync(cancellationToken); + return true; + } + + public void Update(TEntity entity) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Pole.Domain.EntityframeworkCore/Pole.Domain.EntityframeworkCore.csproj b/src/Pole.Domain.EntityframeworkCore/Pole.Domain.EntityframeworkCore.csproj index bc458df..a5c207c 100644 --- a/src/Pole.Domain.EntityframeworkCore/Pole.Domain.EntityframeworkCore.csproj +++ b/src/Pole.Domain.EntityframeworkCore/Pole.Domain.EntityframeworkCore.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -10,6 +10,7 @@ + diff --git a/src/Pole.Domain/ServiceCollectionExtensions.cs b/src/Pole.Domain.EntityframeworkCore/ServiceCollectionExtension.cs similarity index 52% rename from src/Pole.Domain/ServiceCollectionExtensions.cs rename to src/Pole.Domain.EntityframeworkCore/ServiceCollectionExtension.cs index 8bd95c5..f288914 100644 --- a/src/Pole.Domain/ServiceCollectionExtensions.cs +++ b/src/Pole.Domain.EntityframeworkCore/ServiceCollectionExtension.cs @@ -1,17 +1,21 @@ -using MediatR; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Pole.Application; +using Pole.Domain.EntityframeworkCore; +using Pole.Domain.EntityframeworkCore.UnitOfWork; +using Pole.Domain.UnitOfWork; using System; using System.Collections.Generic; using System.Text; -namespace Pole.Domain +namespace Microsoft.Extensions.DependencyInjection { - public static class ServiceCollectionExtensions + public static class PoleApplicationOptionsExtension { - public static IServiceCollection AddPoleDomain(this IServiceCollection service) + public static PoleOptions AddPoleEntityFrameworkCoreDomain(this PoleOptions options) { - service.AddMediatR(); - return service; + options.Services.AddScoped(); + return options; } } } diff --git a/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWork.cs b/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWork.cs new file mode 100644 index 0000000..236437e --- /dev/null +++ b/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWork.cs @@ -0,0 +1,33 @@ +using Microsoft.EntityFrameworkCore.Storage; +using Pole.Domain.UnitOfWork; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Pole.Domain.EntityframeworkCore.UnitOfWork +{ + public class EntityFrameworkCoreUnitOfWork : IUnitOfWork + { + private readonly IDbContextTransaction _dbContextTransaction; + public EntityFrameworkCoreUnitOfWork(IDbContextTransaction dbContextTransaction) + { + _dbContextTransaction = dbContextTransaction; + } + public Task CompeleteAsync(CancellationToken cancellationToken = default) + { + return _dbContextTransaction.CommitAsync(cancellationToken); + } + + public void Dispose() + { + _dbContextTransaction?.Dispose(); + } + + public Task RollbackAsync(CancellationToken cancellationToken = default) + { + return _dbContextTransaction.RollbackAsync(); + } + } +} diff --git a/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWorkManager.cs b/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWorkManager.cs new file mode 100644 index 0000000..8377706 --- /dev/null +++ b/src/Pole.Domain.EntityframeworkCore/UnitOfWork/EntityFrameworkCoreUnitOfWorkManager.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Pole.Domain.UnitOfWork; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Pole.Domain.EntityframeworkCore.UnitOfWork +{ + public class EntityFrameworkCoreUnitOfWorkManager : IUnitOfWorkManager + { + private readonly DbContext _dbContext; + public EntityFrameworkCoreUnitOfWorkManager(DbContextOptions dbContextOptions, IServiceProvider serviceProvider) + { + _dbContext = serviceProvider.GetRequiredService(dbContextOptions.ContextType) as DbContext; + } + public async Task BeginUnitOfWork() + { + var transaction = await _dbContext.Database.BeginTransactionAsync(); + EntityFrameworkCoreUnitOfWork entityFrameworkCoreUnitOfWork = new EntityFrameworkCoreUnitOfWork(transaction); + + return entityFrameworkCoreUnitOfWork; + } + } +} diff --git a/src/Pole.Domain/IRepository.cs b/src/Pole.Domain/IRepository.cs index 6350c50..24eceaf 100644 --- a/src/Pole.Domain/IRepository.cs +++ b/src/Pole.Domain/IRepository.cs @@ -14,7 +14,7 @@ namespace Pole.Domain void Delete(T entity); void Add(T entity); Task Get(string id); - IUnitOfWork UnitOfWork { get; } + Task SaveEntitiesAsync(CancellationToken cancellationToken = default); } public interface IRepository: IScopedDenpendency { diff --git a/src/Pole.Domain/UnitOfWork/IUnitOfWork.cs b/src/Pole.Domain/UnitOfWork/IUnitOfWork.cs index a5823da..273b023 100644 --- a/src/Pole.Domain/UnitOfWork/IUnitOfWork.cs +++ b/src/Pole.Domain/UnitOfWork/IUnitOfWork.cs @@ -8,8 +8,8 @@ namespace Pole.Domain.UnitOfWork { public interface IUnitOfWork : IDisposable { - //Task SaveChangesAsync(CancellationToken cancellationToken = default); - Task CompeleteAsync(CancellationToken cancellationToken = default); + Task CompeleteAsync(CancellationToken cancellationToken = default); + Task RollbackAsync(CancellationToken cancellationToken = default); } } diff --git a/src/Pole.Domain/UnitOfWork/IUnitOfWorkManager.cs b/src/Pole.Domain/UnitOfWork/IUnitOfWorkManager.cs new file mode 100644 index 0000000..ba9afdf --- /dev/null +++ b/src/Pole.Domain/UnitOfWork/IUnitOfWorkManager.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Pole.Domain.UnitOfWork +{ + public interface IUnitOfWorkManager + { + Task BeginUnitOfWork(); + } +} diff --git a/src/Pole.Domain/UnitOfWork/CompleteResult.cs b/src/Pole.Domain/UnitOfWork/UnitOfWorkResult.cs similarity index 77% rename from src/Pole.Domain/UnitOfWork/CompleteResult.cs rename to src/Pole.Domain/UnitOfWork/UnitOfWorkResult.cs index c1c7a6d..7c701da 100644 --- a/src/Pole.Domain/UnitOfWork/CompleteResult.cs +++ b/src/Pole.Domain/UnitOfWork/UnitOfWorkResult.cs @@ -4,10 +4,11 @@ using System.Text; namespace Pole.Domain.UnitOfWork { - public class CompleteResult + public class UnitOfWorkResult { - public static CompleteResult SuccessResult = new CompleteResult(1, "保存成功"); - public CompleteResult(int status, string message) + public static UnitOfWorkResult SuccessResult = new UnitOfWorkResult(1, "保存成功"); + public static UnitOfWorkResult FaildResult = new UnitOfWorkResult(1, "保存失败"); + public UnitOfWorkResult(int status, string message) { Status = status; Message = message; diff --git a/src/Pole.Grpc/ExtraType/CommonCommandResponse.cs b/src/Pole.Grpc/ExtraType/CommonCommandResponse.cs index 4117179..61712d2 100644 --- a/src/Pole.Grpc/ExtraType/CommonCommandResponse.cs +++ b/src/Pole.Grpc/ExtraType/CommonCommandResponse.cs @@ -9,9 +9,10 @@ namespace Pole.Grpc.ExtraType { public partial class CommonCommandResponse { - public static implicit operator CommonCommandResponse(CompleteResult domainHandleResult) + public static CommonCommandResponse SuccessResponse = new CommonCommandResponse() { - return new CommonCommandResponse { Status = domainHandleResult.Status, Message = domainHandleResult.Message }; - } + Message = "执行成功", + Status = 1 + }; } } diff --git a/src/Pole.Grpc/PoleGrpcOptionExtensions.cs b/src/Pole.Grpc/PoleGrpcOptionExtensions.cs deleted file mode 100644 index 29b144f..0000000 --- a/src/Pole.Grpc/PoleGrpcOptionExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Pole.Application; -using Pole.Domain; - -namespace Pole.Grpc -{ - public static class PoleGrpcOptionExtensions - { - public static PoleGrpcOptions AddPoleApplication(this PoleGrpcOptions poleGrpcOptions) - { - poleGrpcOptions.Services.AddPoleApplication(options => { - options.AutoInjectionCommandHandlersAndDomainEventHandlers(); - if (poleGrpcOptions.AutoInject) - { - options.AutoInjectionDependency(); - } - }, poleGrpcOptions.ApplicationAssemblies.ToArray()); - - return poleGrpcOptions; - } - public static PoleGrpcOptions AddPoleDomain(this PoleGrpcOptions poleGrpcOptions) - { - poleGrpcOptions.Services.AddPoleDomain(); - return poleGrpcOptions; - } - } -} diff --git a/src/Pole.Grpc/ServiceCollectionExtensions.cs b/src/Pole.Grpc/ServiceCollectionExtensions.cs index d44ed4f..ac8e764 100644 --- a/src/Pole.Grpc/ServiceCollectionExtensions.cs +++ b/src/Pole.Grpc/ServiceCollectionExtensions.cs @@ -9,13 +9,14 @@ namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { - public static IServiceCollection AddPoleGrpc(this IServiceCollection services, params Assembly[] assemblies) - { - PoleGrpcOptions poleGrpcOptions = new PoleGrpcOptions(services, assemblies); - poleGrpcOptions.AddPoleApplication(); - poleGrpcOptions.AddPoleDomain(); - // poleGrpcOptions.Services.AddGrpcValidation(); - return services; - } + //public static IServiceCollection AddPoleGrpc(this IServiceCollection services, params Assembly[] assemblies) + //{ + // // PoleGrpcOptions poleGrpcOptions = new PoleGrpcOptions(services, assemblies); + + // //poleGrpcOptions.Services.AddGrpcValidation(); + + // // poleGrpcOptions.Services.addv + // return services; + //} } }