From 0e42600639618ca07af423b7a91468e1e58b6a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Jan 2018 11:08:02 +0300 Subject: [PATCH] Introduced repository without PR for mongodb. --- .../MongoDB/IMongoDbRepository.cs | 19 ++- .../Repositories/MongoDB/MongoDbRepository.cs | 121 +++++++++++------- ...ongoDbContextRegistrationOptionsBuilder.cs | 1 - .../MongoDbRepositoryRegistrar.cs | 2 +- 4 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs index e33d7116c5..c20c5dca1e 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs @@ -1,17 +1,10 @@ -using System; -using MongoDB.Driver; +using MongoDB.Driver; using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories.MongoDB { - //public interface IMongoDbRepository : IMongoDbRepository, IQueryableRepository - // where TEntity : class, IEntity - //{ - - //} - - public interface IMongoDbRepository : IQueryableRepository - where TEntity : class, IEntity + public interface IMongoDbRepository : IQueryableRepository + where TEntity : class, IEntity { IMongoDatabase Database { get; } @@ -19,4 +12,10 @@ namespace Volo.Abp.Domain.Repositories.MongoDB string CollectionName { get; } } + + public interface IMongoDbRepository : IMongoDbRepository, IQueryableRepository + where TEntity : class, IEntity + { + + } } diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 2465246e61..3141da949e 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; @@ -10,19 +9,9 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.Domain.Repositories.MongoDB { - //public class MongoDbRepository : MongoDbRepository, IMongoDbRepository - // where TMongoDbContext : AbpMongoDbContext - // where TEntity : class, IEntity - //{ - // public MongoDbRepository(IMongoDatabaseProvider databaseProvider) - // : base(databaseProvider) - // { - // } - //} - - public class MongoDbRepository : QueryableRepositoryBase, IMongoDbRepository + public class MongoDbRepository : QueryableRepositoryBase, IMongoDbRepository where TMongoDbContext : AbpMongoDbContext - where TEntity : class, IEntity + where TEntity : class, IEntity { public virtual string CollectionName => DatabaseProvider.DbContext.GetCollectionName(); @@ -37,18 +26,6 @@ namespace Volo.Abp.Domain.Repositories.MongoDB DatabaseProvider = databaseProvider; } - public override async Task GetAsync(TPrimaryKey id, CancellationToken cancellationToken = default) - { - var entity = await FindAsync(id, cancellationToken); - - if (entity == null) - { - throw new EntityNotFoundException(typeof(TEntity), id); - } - - return entity; - } - public override TEntity Insert(TEntity entity, bool autoSave = false) { Collection.InsertOne(entity); @@ -63,55 +40,109 @@ namespace Volo.Abp.Domain.Repositories.MongoDB public override TEntity Update(TEntity entity) { - var filter = Builders.Filter.Eq(e => e.Id, entity.Id); - Collection.ReplaceOne(filter, entity); + Collection.ReplaceOne(CreateEntityFilter(entity), entity); return entity; } public override async Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default) { - var filter = Builders.Filter.Eq(e => e.Id, entity.Id); - await Collection.ReplaceOneAsync(filter, entity, cancellationToken: cancellationToken); + await Collection.ReplaceOneAsync(CreateEntityFilter(entity), entity, cancellationToken: cancellationToken); return entity; } public override void Delete(TEntity entity) { - Delete(entity.Id); + Collection.DeleteOne(CreateEntityFilter(entity)); } - public override void Delete(TPrimaryKey id) + public override async Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default) { - var filter = Builders.Filter.Eq(e => e.Id, id); - Collection.DeleteOne(filter); + await Collection.DeleteOneAsync(CreateEntityFilter(entity), cancellationToken); } public override void Delete(Expression> predicate) { - var filter = Builders.Filter.Where(predicate); - Collection.DeleteOne(filter); + Collection.DeleteMany(Builders.Filter.Where(predicate)); } - public override Task DeleteAsync(TPrimaryKey id, CancellationToken cancellationToken = default) + public override async Task DeleteAsync(Expression> predicate, CancellationToken cancellationToken = default) { - var filter = Builders.Filter.Eq(e => e.Id, id); - return Collection.DeleteOneAsync(filter, cancellationToken: cancellationToken); + await Collection.DeleteManyAsync(Builders.Filter.Where(predicate), cancellationToken); } - public override Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default) + protected override IQueryable GetQueryable() { - return DeleteAsync(entity.Id, cancellationToken); + return Collection.AsQueryable(); } - public override Task DeleteAsync(Expression> predicate, CancellationToken cancellationToken = default) + protected virtual FilterDefinition CreateEntityFilter(TEntity entity) { - var filter = Builders.Filter.Where(predicate); - return Collection.DeleteOneAsync(filter, cancellationToken: cancellationToken); + throw new NotImplementedException("CreateEntityFilter is not implemented for MongoDb by default. It should be overrided and implemented by deriving classes!"); } + } - protected override IQueryable GetQueryable() + public class MongoDbRepository : MongoDbRepository, IMongoDbRepository + where TMongoDbContext : AbpMongoDbContext + where TEntity : class, IEntity + { + public MongoDbRepository(IMongoDatabaseProvider databaseProvider) + : base(databaseProvider) { - return Collection.AsQueryable(); + + } + + public virtual TEntity Get(TPrimaryKey id) + { + var entity = Find(id); + + if (entity == null) + { + throw new EntityNotFoundException(typeof(TEntity), id); + } + + return entity; + } + + public virtual async Task GetAsync(TPrimaryKey id, CancellationToken cancellationToken = default) + { + var entity = await FindAsync(id, cancellationToken); + + if (entity == null) + { + throw new EntityNotFoundException(typeof(TEntity), id); + } + + return entity; + } + + public virtual void Delete(TPrimaryKey id) + { + Collection.DeleteOne(CreateEntityFilter(id)); + } + + public virtual Task DeleteAsync(TPrimaryKey id, CancellationToken cancellationToken = default) + { + return Collection.DeleteOneAsync(CreateEntityFilter(id), cancellationToken); + } + + public virtual async Task FindAsync(TPrimaryKey id, CancellationToken cancellationToken = default) + { + return await Collection.Find(CreateEntityFilter(id)).FirstOrDefaultAsync(cancellationToken); + } + + public virtual TEntity Find(TPrimaryKey id) + { + return Collection.Find(CreateEntityFilter(id)).FirstOrDefault(); + } + + protected override FilterDefinition CreateEntityFilter(TEntity entity) + { + return Builders.Filter.Eq(e => e.Id, entity.Id); + } + + private static FilterDefinition CreateEntityFilter(TPrimaryKey id) + { + return Builders.Filter.Eq(e => e.Id, id); } } } \ No newline at end of file diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/IMongoDbContextRegistrationOptionsBuilder.cs b/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/IMongoDbContextRegistrationOptionsBuilder.cs index 3e626b6558..6504639862 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/IMongoDbContextRegistrationOptionsBuilder.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/IMongoDbContextRegistrationOptionsBuilder.cs @@ -1,4 +1,3 @@ -using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.MongoDB.DependencyInjection diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbRepositoryRegistrar.cs b/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbRepositoryRegistrar.cs index 6d9d76be77..362f2bdb31 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbRepositoryRegistrar.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/MongoDbRepositoryRegistrar.cs @@ -21,7 +21,7 @@ namespace Volo.Abp.MongoDB.DependencyInjection protected override Type GetRepositoryType(Type dbContextType, Type entityType) { - throw new NotImplementedException(); + return typeof(MongoDbRepository<,,>).MakeGenericType(dbContextType, entityType); } protected override Type GetRepositoryType(Type dbContextType, Type entityType, Type primaryKeyType)