From 21bc0bdc1171f9aca8e257693ca8bce9a215b202 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 9 Feb 2021 17:54:03 +0800 Subject: [PATCH] Add AddDefaultRepository method --- .../AbpCommonDbContextRegistrationOptions.cs | 22 +++++++- ...mmonDbContextRegistrationOptionsBuilder.cs | 14 +++++ .../Repositories/RepositoryRegistrarBase.cs | 16 +++++- .../RepositoryRegistration_Tests.cs | 54 +++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs index dbd46811f2..babe1da1f9 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs @@ -29,6 +29,8 @@ namespace Volo.Abp.DependencyInjection public Dictionary CustomRepositories { get; } + public List DefaultRepositories { get; } + public bool SpecifiedDefaultRepositoryTypes => DefaultRepositoryImplementationType != null && DefaultRepositoryImplementationTypeWithoutKey != null; protected AbpCommonDbContextRegistrationOptions(Type originalDbContextType, IServiceCollection services) @@ -38,6 +40,7 @@ namespace Volo.Abp.DependencyInjection DefaultRepositoryDbContextType = originalDbContextType; CustomRepositories = new Dictionary(); ReplacedDbContextTypes = new List(); + DefaultRepositories = new List(); } public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext() @@ -82,6 +85,23 @@ namespace Volo.Abp.DependencyInjection return AddDefaultRepositories(typeof(TDefaultRepositoryDbContext), includeAllEntities); } + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository() + { + return AddDefaultRepository(typeof(TEntity)); + } + + public IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType) + { + if (!typeof(IEntity).IsAssignableFrom(entityType)) + { + throw new AbpException($"Given entityType is not an entity: {entityType.AssemblyQualifiedName}. It must implement {typeof(IEntity<>).AssemblyQualifiedName}."); + } + + DefaultRepositories.AddIfNotContains(entityType); + + return this; + } + public IAbpCommonDbContextRegistrationOptionsBuilder AddRepository() { AddCustomRepository(typeof(TEntity), typeof(TRepository)); @@ -118,4 +138,4 @@ namespace Volo.Abp.DependencyInjection CustomRepositories[entityType] = repositoryType; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index 53d2f142cd..ebe49718b2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -39,6 +39,20 @@ namespace Volo.Abp.DependencyInjection /// IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false); + /// + /// Registers custom repository for a specific entity. + /// + /// Entity type + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(); + + + /// + /// Registers default repository for a specific entity. + /// + /// + /// + IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepository(Type entityType); + /// /// Registers custom repository for a specific entity. /// Custom repositories overrides default repositories. diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index f3b2fc388f..35129134c3 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities; @@ -27,6 +28,12 @@ namespace Volo.Abp.Domain.Repositories { RegisterDefaultRepositories(); } + + foreach (var entityType in Options.DefaultRepositories) + { + ShouldRegisterDefaultRepositoryFor(entityType); + RegisterDefaultRepository(entityType); + } } protected virtual void RegisterDefaultRepositories() @@ -68,7 +75,7 @@ namespace Volo.Abp.Domain.Repositories protected virtual bool ShouldRegisterDefaultRepositoryFor(Type entityType) { - if (!Options.RegisterDefaultRepositories) + if (!Options.RegisterDefaultRepositories && !Options.DefaultRepositories.Any()) { return false; } @@ -78,6 +85,11 @@ namespace Volo.Abp.Domain.Repositories return false; } + if (Options.DefaultRepositories.Contains(entityType)) + { + return true; + } + if (!Options.IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType)) { return false; @@ -92,4 +104,4 @@ namespace Volo.Abp.Domain.Repositories protected abstract Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType); } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs index 85696fae21..32584f293e 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs @@ -189,6 +189,60 @@ namespace Volo.Abp.Domain.Repositories services.ShouldContainTransient(typeof(IRepository), typeof(MyTestCustomBaseRepository)); } + [Fact] + public void Should_Register_Default_Repository() + { + //Arrange + + var services = new ServiceCollection(); + + var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services); + options.AddDefaultRepository(); + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithoutPk + services.ShouldNotContainService(typeof(IReadOnlyRepository)); + services.ShouldNotContainService(typeof(IBasicRepository)); + services.ShouldNotContainService(typeof(IRepository)); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestDefaultRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestDefaultRepository)); + } + + [Fact] + public void Should_Not_Register_Default_Repository_If_Registered_Custom_Repository() + { + //Arrange + + var services = new ServiceCollection(); + + var options = new TestDbContextRegistrationOptions(typeof(MyFakeDbContext), services); + options + .AddDefaultRepository() + .AddRepository();; + + //Act + + new MyTestRepositoryRegistrar(options).AddRepositories(); + + //MyTestAggregateRootWithGuidPk + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IReadOnlyBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IBasicRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + services.ShouldContainTransient(typeof(IRepository), typeof(MyTestAggregateRootWithDefaultPkCustomRepository)); + } + public class MyTestRepositoryRegistrar : RepositoryRegistrarBase { public MyTestRepositoryRegistrar(AbpCommonDbContextRegistrationOptions options)