From f8465f8b31bd51be196db4fd5f0063d819a4d6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 31 Aug 2025 14:34:42 +0300 Subject: [PATCH] Add provider name support to repository infrastructure Introduces a ProviderName property to IRepository and related base classes, requiring repositories to specify their provider via constructor. Adds provider constants for EF Core, MemoryDb, and MongoDB, and updates repository implementations and tests accordingly. Also refactors EntityName to a public property and renames WithEntityName extension to SetEntityName. --- .../Abp/Domain/Repositories/BasicRepositoryBase.cs | 14 +++++++++++--- .../Volo/Abp/Domain/Repositories/IRepository.cs | 6 ++++-- .../Volo/Abp/Domain/Repositories/RepositoryBase.cs | 10 ++++++++++ .../Domain/Repositories/RepositoryExtensions.cs | 4 ++-- .../EntityFrameworkCore/EfCoreRepository.cs | 1 + .../Abp/EntityFrameworkCore/AbpEfCoreConsts.cs | 6 ++++++ .../Repositories/MemoryDb/MemoryDbRepository.cs | 1 + .../Volo/Abp/MemoryDb/AbpMemoryDbConsts.cs | 6 ++++++ .../Repositories/MongoDB/MongoDbRepository.cs | 1 + .../Volo/Abp/MongoDB/AbpMongoDbConsts.cs | 6 ++++++ .../Repositories/RepositoryRegistration_Tests.cs | 11 ++++++----- 11 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreConsts.cs create mode 100644 framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/AbpMemoryDbConsts.cs create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbConsts.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs index f85a156184..32c0cc71bf 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs @@ -44,16 +44,18 @@ public abstract class BasicRepositoryBase : public bool? IsChangeTrackingEnabled { get; protected set; } - protected string? EntityName { get; private set; } + public string? EntityName { get; set; } public void SetEntityName(string? name) { EntityName = name; } - protected BasicRepositoryBase() - { + public string ProviderName { get; } + protected BasicRepositoryBase(string providerName) + { + ProviderName = Check.NotNullOrWhiteSpace(providerName, nameof(providerName)); } public abstract Task InsertAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default); @@ -146,6 +148,12 @@ public abstract class BasicRepositoryBase : public abstract class BasicRepositoryBase : BasicRepositoryBase, IBasicRepository where TEntity : class, IEntity { + protected BasicRepositoryBase(string providerName) + : base(providerName) + { + + } + public virtual async Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { var entity = await FindAsync(id, includeDetails, cancellationToken); diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs index d5a66b1fe7..cadc25da43 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs @@ -8,13 +8,15 @@ using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories; /// -/// Just to mark a class as repository. +/// The base interface to implement a repository for an entity. /// public interface IRepository { bool? IsChangeTrackingEnabled { get; } - void SetEntityName(string? name); + string? EntityName { get; set; } + + string ProviderName { get; } } public interface IRepository : IReadOnlyRepository, IBasicRepository diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs index eb2457f8c8..1277b9ceb8 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs @@ -14,6 +14,11 @@ namespace Volo.Abp.Domain.Repositories; public abstract class RepositoryBase : BasicRepositoryBase, IRepository, IUnitOfWorkManagerAccessor where TEntity : class, IEntity { + protected RepositoryBase(string providerName) + : base(providerName) + { + } + [Obsolete("Use WithDetailsAsync method.")] public virtual IQueryable WithDetails() { @@ -92,6 +97,11 @@ public abstract class RepositoryBase : BasicRepositoryBase, IR public abstract class RepositoryBase : RepositoryBase, IRepository where TEntity : class, IEntity { + protected RepositoryBase(string providerName) + : base(providerName) + { + } + public abstract Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); public abstract Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 9fc9c16d31..70e69490a4 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -251,12 +251,12 @@ public static class RepositoryExtensions await repository.DeleteAsync(entity, autoSave, cancellationToken); } - public static TRepository WithEntityName( + public static TRepository SetEntityName( this TRepository repository, string name ) where TRepository : class, IRepository { - repository.SetEntityName(name); + repository.EntityName = name; return repository; } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index fd61e72781..575dccadef 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -93,6 +93,7 @@ public class EfCoreRepository : RepositoryBase, IE public IEfCoreBulkOperationProvider? BulkOperationProvider => LazyServiceProvider.LazyGetService(); public EfCoreRepository(IDbContextProvider dbContextProvider) + : base(AbpEfCoreConsts.ProviderName) { _dbContextProvider = dbContextProvider; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreConsts.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreConsts.cs new file mode 100644 index 0000000000..6d1f0c9dc6 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreConsts.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.EntityFrameworkCore; + +public class AbpEfCoreConsts +{ + public const string ProviderName = "Volo.Abp.EntityFrameworkCore"; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 058508a30a..9bef2a124a 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -50,6 +50,7 @@ public class MemoryDbRepository : RepositoryBase LazyServiceProvider.LazyGetRequiredService(); public MemoryDbRepository(IMemoryDatabaseProvider databaseProvider) + : base(AbpMemoryDbConsts.ProviderName) { DatabaseProvider = databaseProvider; } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/AbpMemoryDbConsts.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/AbpMemoryDbConsts.cs new file mode 100644 index 0000000000..a15563c68f --- /dev/null +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/AbpMemoryDbConsts.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.MemoryDb; + +public class AbpMemoryDbConsts +{ + public const string ProviderName = "Volo.Abp.MemoryDb"; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index fdc7464d6b..a8cc1d39ae 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -101,6 +101,7 @@ public class MongoDbRepository public IMongoDbRepositoryFilterer RepositoryFilterer => LazyServiceProvider.LazyGetService>()!; public MongoDbRepository(IMongoDbContextProvider dbContextProvider) + : base(AbpMongoDbConsts.ProviderName) { DbContextProvider = dbContextProvider; } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbConsts.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbConsts.cs new file mode 100644 index 0000000000..e107d31bf0 --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbConsts.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.MongoDB; + +public class AbpMongoDbConsts +{ + public const string ProviderName = "Volo.Abp.MongoDB"; +} \ 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 193bbaed14..bb2e9eeecd 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 @@ -295,6 +295,10 @@ public class RepositoryRegistration_Tests public class MyTestDefaultRepository : RepositoryBase where TEntity : class, IEntity { + public MyTestDefaultRepository() + : base("MyTestDefault") + { + } [Obsolete("Use GetQueryableAsync method.")] protected override IQueryable GetQueryable() @@ -408,11 +412,8 @@ public class RepositoryRegistration_Tests public class MyTestAggregateRootWithDefaultPkEmptyRepository : IMyTestAggregateRootWithDefaultPkEmptyRepository { public bool? IsChangeTrackingEnabled { get; set; } - - public void SetEntityName(string name) - { - - } + public string EntityName { get; set; } + public string ProviderName { get; } = "MyFakeProvider"; } public class TestDbContextRegistrationOptions : AbpCommonDbContextRegistrationOptions