From b068513f5b4c0eeb8dbb336fee6e1309f821e488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 2 Jan 2017 22:44:25 +0300 Subject: [PATCH] Refactored repository registration. --- .../AbpDbContextRegistrationOptions.cs | 1 - .../AbpEfCoreServiceCollectionExtensions.cs | 43 +------------ .../EfCoreRepositoryRegistrar.cs | 31 ++++++++++ ...IAbpDbContextRegistrationOptionsBuilder.cs | 1 - .../AbpMongoDbServiceCollectionExtensions.cs | 43 +------------ .../MongoDB/EfCoreRepositoryRegistrar.cs | 32 ++++++++++ .../CommonDbContextRegistrationOptions.cs | 3 +- ...mmonDbContextRegistrationOptionsBuilder.cs | 2 +- .../Volo/Abp/Data/RepositoryRegistrarBase.cs | 60 +++++++++++++++++++ 9 files changed, 129 insertions(+), 87 deletions(-) create mode 100644 src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/EfCoreRepositoryRegistrar.cs create mode 100644 src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/EfCoreRepositoryRegistrar.cs rename src/Volo.Abp/{Microsoft/Extensions/DependencyInjection => Volo/Abp/Data}/CommonDbContextRegistrationOptions.cs (97%) rename src/Volo.Abp/{Microsoft/Extensions/DependencyInjection => Volo/Abp/Data}/ICommonDbContextRegistrationOptionsBuilder.cs (94%) create mode 100644 src/Volo.Abp/Volo/Abp/Data/RepositoryRegistrarBase.cs diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextRegistrationOptions.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextRegistrationOptions.cs index 03a8d70bb5..ca1597c196 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextRegistrationOptions.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextRegistrationOptions.cs @@ -1,5 +1,4 @@ using Volo.Abp.Data; -using Volo.Abp.Domain.Repositories; namespace Microsoft.Extensions.DependencyInjection { diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs index 41c81ff5df..98ada91e2d 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs @@ -1,9 +1,5 @@ using System; -using System.Reflection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Volo.Abp.Data; -using Volo.Abp.Domain.Entities; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; namespace Microsoft.Extensions.DependencyInjection @@ -23,45 +19,10 @@ namespace Microsoft.Extensions.DependencyInjection var options = new AbpDbContextRegistrationOptions(); optionsBuilder?.Invoke(options); - AddRepositories(services, options); + new EfCoreRepositoryRegistrar(options) + .AddRepositories(services, typeof(TDbContext)); return services; } - - private static void AddRepositories(IServiceCollection services, AbpDbContextRegistrationOptions options) - where TDbContext : AbpDbContext - { - foreach (var customRepository in options.CustomRepositories) - { - services.AddDefaultRepository(customRepository.Key, customRepository.Value); - } - - if (options.RegisterDefaultRepositories) - { - RegisterDefaultRepositories(services, typeof(TDbContext), options); - } - } - - private static void RegisterDefaultRepositories(IServiceCollection services, Type dbContextType, AbpDbContextRegistrationOptions options) - { - foreach (var entityType in DbContextHelper.GetEntityTypes(dbContextType)) - { - if (!options.ShouldRegisterDefaultRepositoryFor(entityType)) - { - continue; - } - - RegisterDefaultRepository(services, dbContextType, entityType, options); - } - } - - private static void RegisterDefaultRepository(IServiceCollection services, Type dbContextType, Type entityType, AbpDbContextRegistrationOptions options) - { - var repositoryImplementationType = typeof(IEntity).GetTypeInfo().IsAssignableFrom(entityType) - ? typeof(EfCoreRepository<,>).MakeGenericType(dbContextType, entityType) - : typeof(EfCoreRepository<,,>).MakeGenericType(dbContextType, entityType, EntityHelper.GetPrimaryKeyType(entityType)); - - services.AddDefaultRepository(entityType, repositoryImplementationType); - } } } diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/EfCoreRepositoryRegistrar.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/EfCoreRepositoryRegistrar.cs new file mode 100644 index 0000000000..268f8927b1 --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/EfCoreRepositoryRegistrar.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Data; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Microsoft.Extensions.DependencyInjection +{ + public class EfCoreRepositoryRegistrar : RepositoryRegistrarBase + { + public EfCoreRepositoryRegistrar(AbpDbContextRegistrationOptions options) + : base(options) + { + } + + public override IEnumerable GetEntityTypes(Type dbContextType) + { + return DbContextHelper.GetEntityTypes(dbContextType); + } + + protected override Type GetRepositoryTypeForDefaultPk(Type dbContextType, Type entityType) + { + return typeof(EfCoreRepository<,>).MakeGenericType(dbContextType, entityType); + } + + protected override Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType) + { + return typeof(EfCoreRepository<,,>).MakeGenericType(dbContextType, entityType, primaryKeyType); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs index efc990ca0b..aa9fc68458 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextRegistrationOptionsBuilder.cs @@ -1,5 +1,4 @@ using Volo.Abp.Data; -using Volo.Abp.Domain.Repositories; namespace Microsoft.Extensions.DependencyInjection { diff --git a/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs b/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs index 15be1808f0..04180246f8 100644 --- a/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs +++ b/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs @@ -1,6 +1,4 @@ using System; -using System.Reflection; -using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; @@ -14,47 +12,10 @@ namespace Microsoft.Extensions.DependencyInjection var options = new MongoDbContextRegistrationOptions(); optionsBuilder?.Invoke(options); - AddRepositories(services, options); + new MongoDbRepositoryRegistrar(options) + .AddRepositories(services, typeof(TMongoDbContext)); return services; } - - private static void AddRepositories(IServiceCollection services, MongoDbContextRegistrationOptions options) - where TMongoDbContext : AbpMongoDbContext - { - foreach (var customRepository in options.CustomRepositories) - { - services.AddDefaultRepository(customRepository.Key, customRepository.Value); - } - - if (options.RegisterDefaultRepositories) - { - RegisterDefaultRepositories(services, typeof(TMongoDbContext), options); - } - } - - private static void RegisterDefaultRepositories(IServiceCollection services, Type dbContextType, MongoDbContextRegistrationOptions options) - { - var mongoDbContext = (AbpMongoDbContext) Activator.CreateInstance(dbContextType); - - foreach (var entityType in mongoDbContext.GetEntityCollectionTypes()) - { - if (!options.ShouldRegisterDefaultRepositoryFor(entityType)) - { - continue; - } - - RegisterDefaultRepository(services, dbContextType, entityType, options); - } - } - - private static void RegisterDefaultRepository(IServiceCollection services, Type dbContextType, Type entityType, MongoDbContextRegistrationOptions options) - { - var repositoryImplementationType = typeof(IEntity).GetTypeInfo().IsAssignableFrom(entityType) - ? typeof(MongoDbRepository<,>).MakeGenericType(dbContextType, entityType) - : typeof(MongoDbRepository<,,>).MakeGenericType(dbContextType, entityType, EntityHelper.GetPrimaryKeyType(entityType)); - - services.AddDefaultRepository(entityType, repositoryImplementationType); - } } } diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/EfCoreRepositoryRegistrar.cs b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/EfCoreRepositoryRegistrar.cs new file mode 100644 index 0000000000..8e54893fec --- /dev/null +++ b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/EfCoreRepositoryRegistrar.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Data; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.Domain.Repositories.MongoDB +{ + public class MongoDbRepositoryRegistrar : RepositoryRegistrarBase + { + public MongoDbRepositoryRegistrar(MongoDbContextRegistrationOptions options) + : base(options) + { + } + + public override IEnumerable GetEntityTypes(Type dbContextType) + { + var mongoDbContext = (AbpMongoDbContext)Activator.CreateInstance(dbContextType); + return mongoDbContext.GetEntityCollectionTypes(); + } + + protected override Type GetRepositoryTypeForDefaultPk(Type dbContextType, Type entityType) + { + return typeof(MongoDbRepository<,>).MakeGenericType(dbContextType, entityType); + } + + protected override Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType) + { + return typeof(MongoDbRepository<,,>).MakeGenericType(dbContextType, entityType, primaryKeyType); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/CommonDbContextRegistrationOptions.cs b/src/Volo.Abp/Volo/Abp/Data/CommonDbContextRegistrationOptions.cs similarity index 97% rename from src/Volo.Abp/Microsoft/Extensions/DependencyInjection/CommonDbContextRegistrationOptions.cs rename to src/Volo.Abp/Volo/Abp/Data/CommonDbContextRegistrationOptions.cs index 341812998b..ab51aa9c31 100644 --- a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/CommonDbContextRegistrationOptions.cs +++ b/src/Volo.Abp/Volo/Abp/Data/CommonDbContextRegistrationOptions.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; -using Volo.Abp; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Reflection; -namespace Microsoft.Extensions.DependencyInjection +namespace Volo.Abp.Data { public class CommonDbContextRegistrationOptions : ICommonDbContextRegistrationOptionsBuilder { diff --git a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ICommonDbContextRegistrationOptionsBuilder.cs b/src/Volo.Abp/Volo/Abp/Data/ICommonDbContextRegistrationOptionsBuilder.cs similarity index 94% rename from src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ICommonDbContextRegistrationOptionsBuilder.cs rename to src/Volo.Abp/Volo/Abp/Data/ICommonDbContextRegistrationOptionsBuilder.cs index d94f7194e9..b3dccff3e6 100644 --- a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ICommonDbContextRegistrationOptionsBuilder.cs +++ b/src/Volo.Abp/Volo/Abp/Data/ICommonDbContextRegistrationOptionsBuilder.cs @@ -1,4 +1,4 @@ -namespace Microsoft.Extensions.DependencyInjection +namespace Volo.Abp.Data { public interface ICommonDbContextRegistrationOptionsBuilder { diff --git a/src/Volo.Abp/Volo/Abp/Data/RepositoryRegistrarBase.cs b/src/Volo.Abp/Volo/Abp/Data/RepositoryRegistrarBase.cs new file mode 100644 index 0000000000..0593f6bdec --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Data/RepositoryRegistrarBase.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Data +{ + public abstract class RepositoryRegistrarBase + where TOptions: CommonDbContextRegistrationOptions + { + public TOptions Options { get; } + + protected RepositoryRegistrarBase(TOptions options) + { + Options = options; + } + + public virtual void AddRepositories(IServiceCollection services, Type dbContextType) + { + foreach (var customRepository in Options.CustomRepositories) + { + services.AddDefaultRepository(customRepository.Key, customRepository.Value); + } + + if (Options.RegisterDefaultRepositories) + { + RegisterDefaultRepositories(services, dbContextType); + } + } + + protected virtual void RegisterDefaultRepositories(IServiceCollection services, Type dbContextType) + { + foreach (var entityType in GetEntityTypes(dbContextType)) + { + if (!Options.ShouldRegisterDefaultRepositoryFor(entityType)) + { + continue; + } + + RegisterDefaultRepository(services, dbContextType, entityType); + } + } + + protected void RegisterDefaultRepository(IServiceCollection services, Type dbContextType, Type entityType) + { + var repositoryImplementationType = typeof(IEntity).GetTypeInfo().IsAssignableFrom(entityType) + ? GetRepositoryTypeForDefaultPk(dbContextType, entityType) + : GetRepositoryType(dbContextType, entityType, EntityHelper.GetPrimaryKeyType(entityType)); + + services.AddDefaultRepository(entityType, repositoryImplementationType); + } + + public abstract IEnumerable GetEntityTypes(Type dbContextType); + + protected abstract Type GetRepositoryTypeForDefaultPk(Type dbContextType, Type entityType); + + protected abstract Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType); + } +} \ No newline at end of file