From 3d64dac66801765a4a8f89f6721ea1be57bc5770 Mon Sep 17 00:00:00 2001 From: Young Date: Wed, 13 Nov 2024 10:12:32 +0800 Subject: [PATCH] updated repository --- src/Infrastructure/DefaultControllerBase.cs | 2 +- src/Infrastructure/PageData.cs | 46 +++++++----- .../Repository/Mongo/IIdentifiable.cs | 4 +- .../Repository/Mongo/IMongoRepositoryBase.cs | 8 +- .../Repository/Mongo/IMongoServiceBase.cs | 37 ++++++++++ .../Repository/Mongo/IdentifiableBase.cs | 8 ++ .../Repository/Mongo/MongoRepositoryBase.cs | 30 ++++++-- .../Repository/Mongo/MongoServiceBase.cs | 73 +++++++++++++++++++ 8 files changed, 178 insertions(+), 30 deletions(-) create mode 100644 src/Infrastructure/Repository/Mongo/IMongoServiceBase.cs create mode 100644 src/Infrastructure/Repository/Mongo/IdentifiableBase.cs create mode 100644 src/Infrastructure/Repository/Mongo/MongoServiceBase.cs diff --git a/src/Infrastructure/DefaultControllerBase.cs b/src/Infrastructure/DefaultControllerBase.cs index c943182..beef4f9 100644 --- a/src/Infrastructure/DefaultControllerBase.cs +++ b/src/Infrastructure/DefaultControllerBase.cs @@ -46,7 +46,7 @@ public class DefaultControllerBase : ControllerBase int totalPages, string message = "successful") { - var pageData = new PageData(page, pageSize, totalPages, totalItems, data); + var pageData = new PageData(page,totalPages, totalItems, pageSize, data); return new MessageData>(pageData, true, message); } diff --git a/src/Infrastructure/PageData.cs b/src/Infrastructure/PageData.cs index ee776ec..1d616ce 100644 --- a/src/Infrastructure/PageData.cs +++ b/src/Infrastructure/PageData.cs @@ -1,23 +1,35 @@ -namespace Infrastructure; - -/// -/// 分页数据 -/// -/// 当前页 -/// 当前页数量 -/// 总页数量 -/// 总条目数量 -/// 返回数据 -/// 实体类型 -public class PageData(int page, int pageSize, int totalPages, long totalItems, List data) +using Mapster; + +namespace Infrastructure; + +public class PageData { - public int Page { get; set; } = page; + public PageData() + { + } + + public PageData(int pageIndex, int pageCount, long dataCount, int pageSize, List data) + { + Page = pageIndex; + PageCount = pageCount; + DataCount = dataCount; + PageSize = pageSize; + Data = data; + } + + public int Page { get; set; } + + public int PageCount { get; set; } - public int PageSize { get; set; } = pageSize; + public long DataCount { get; set; } - public int TotalPages { get; set; } = totalPages; + public int PageSize { get; set; } - public long TotalItems { get; set; } = totalItems; + public List Data { get; set; } - public List Data { get; set; } = data; + public PageData ConvertTo() + { + var result = new PageData(Page, PageCount, DataCount, PageSize, Data?.Adapt>()); + return result; + } } \ No newline at end of file diff --git a/src/Infrastructure/Repository/Mongo/IIdentifiable.cs b/src/Infrastructure/Repository/Mongo/IIdentifiable.cs index 6ccc225..90903ba 100644 --- a/src/Infrastructure/Repository/Mongo/IIdentifiable.cs +++ b/src/Infrastructure/Repository/Mongo/IIdentifiable.cs @@ -4,6 +4,6 @@ namespace Infrastructure.Repository.Mongo; public interface IIdentifiable where TKey : IEquatable { - [BsonId] - TKey Id { get; set; } + [BsonId] TKey Id { get; set; } + string Name { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure/Repository/Mongo/IMongoRepositoryBase.cs b/src/Infrastructure/Repository/Mongo/IMongoRepositoryBase.cs index 3f81e56..5c42c13 100644 --- a/src/Infrastructure/Repository/Mongo/IMongoRepositoryBase.cs +++ b/src/Infrastructure/Repository/Mongo/IMongoRepositoryBase.cs @@ -9,6 +9,8 @@ public interface IMongoRepositoryBase Task AddAsync(TEntity entity); + Task AddManyAsync(IEnumerable entities); + Task GetAsync(TKey id); Task?> GetListAsync(); @@ -21,9 +23,11 @@ public interface IMongoRepositoryBase Task?> GetListFilterAsync(FilterDefinition filter); - Task UpdateAsync(TKey id, TEntity entity); + Task UpdateAsync(TKey id, TEntity entity); + + Task DeleteAsync(TKey id); - Task DeleteAsync(TKey id); + Task DeleteManyAsync(Expression> predicate); Task?> GetPageDataAsync(int page, int pageSize, Expression>? filter = null, diff --git a/src/Infrastructure/Repository/Mongo/IMongoServiceBase.cs b/src/Infrastructure/Repository/Mongo/IMongoServiceBase.cs new file mode 100644 index 0000000..61252e5 --- /dev/null +++ b/src/Infrastructure/Repository/Mongo/IMongoServiceBase.cs @@ -0,0 +1,37 @@ +using MongoDB.Driver; + +namespace Infrastructure.Repository.Mongo; + +public interface IMongoServiceBase where TEntity : class, IIdentifiable, new() + where TKey : IEquatable +{ + IMongoRepositoryBase DAL { get; set; } + + Task AddAsync(TEntity entity); + + Task AddManyAsync(IEnumerable entities); + + Task GetAsync(TKey id); + + Task?> GetListAsync(); + + Task GetByObjectIdAsync(string id); + + Task GetFirstOrDefaultAsync(Expression> predicate); + + public Task?> GetListAsync(Expression> predicate); + + Task?> GetListFilterAsync(FilterDefinition filter); + + Task UpdateAsync(TKey id, TEntity entity); + + Task DeleteAsync(TKey id); + + Task DeleteManyAsync(Expression> predicate); + + Task?> GetPageDataAsync(int page, int pageSize, + Expression>? filter = null, + Expression>? orderBy = null, + bool ascending = false + ); +} \ No newline at end of file diff --git a/src/Infrastructure/Repository/Mongo/IdentifiableBase.cs b/src/Infrastructure/Repository/Mongo/IdentifiableBase.cs new file mode 100644 index 0000000..121abab --- /dev/null +++ b/src/Infrastructure/Repository/Mongo/IdentifiableBase.cs @@ -0,0 +1,8 @@ +namespace Infrastructure.Repository.Mongo; + +public abstract class IdentifiableBase : IIdentifiable where TKey : IEquatable +{ + public TKey Id { get; set; } + + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/Repository/Mongo/MongoRepositoryBase.cs b/src/Infrastructure/Repository/Mongo/MongoRepositoryBase.cs index 8844949..9113004 100644 --- a/src/Infrastructure/Repository/Mongo/MongoRepositoryBase.cs +++ b/src/Infrastructure/Repository/Mongo/MongoRepositoryBase.cs @@ -1,5 +1,6 @@ using MongoDB.Bson; using MongoDB.Driver; +using MongoDB.Driver.Linq; using SqlSugar.Extensions; namespace Infrastructure.Repository.Mongo; @@ -20,6 +21,11 @@ public class MongoRepositoryBase(IMongoDatabase database) : await _collection.InsertOneAsync(entity); } + public async Task AddManyAsync(IEnumerable entities) + { + await _collection.InsertManyAsync(entities); + } + public async Task GetAsync(TKey id) { var filter = Builders.Filter.Eq(_idField, id); @@ -28,7 +34,7 @@ public class MongoRepositoryBase(IMongoDatabase database) : public async Task?> GetListAsync() { - return await _collection.Find(_ => true).ToListAsync(); + return await _collection.AsQueryable().ToListAsync(); } public async Task GetByObjectIdAsync(string id) @@ -54,16 +60,23 @@ public class MongoRepositoryBase(IMongoDatabase database) : return await _collection.Find(filter).ToListAsync(); } - public async Task UpdateAsync(TKey id, TEntity entity) + public async Task UpdateAsync(TKey id, TEntity entity) { var filter = Builders.Filter.Eq(_idField, id); - await _collection.FindOneAndReplaceAsync(filter, entity); + return await _collection.FindOneAndReplaceAsync(filter, entity); } - public async Task DeleteAsync(TKey id) + public async Task DeleteAsync(TKey id) { var filter = Builders.Filter.Eq(_idField, id); - await _collection.FindOneAndDeleteAsync(filter); + return await _collection.FindOneAndDeleteAsync(filter); + } + + public async Task DeleteManyAsync(Expression> predicate) + { + var filter = Builders.Filter.Where(predicate); + var result = await _collection.DeleteManyAsync(filter); + return result.IsAcknowledged; } public async Task?> GetPageDataAsync(int page, int pageSize, @@ -84,7 +97,7 @@ public class MongoRepositoryBase(IMongoDatabase database) : var query = _collection.Find(filter is null ? Builders.Filter.Empty : Builders.Filter.Where(filter)); - var total = await query.CountDocumentsAsync(); + var totalTask = query.CountDocumentsAsync(); var itemTask = query.Skip((page - 1) * pageSize).Limit(pageSize); if (orderBy != null) { @@ -99,7 +112,8 @@ public class MongoRepositoryBase(IMongoDatabase database) : } var items = await itemTask.ToListAsync(); - var totalPages = Math.Ceiling(total.ObjToDecimal() / pageSize.ObjToDecimal()).ObjToInt(); - return new PageData(page, pageSize, totalPages, total, items); + var total = await totalTask; + var pageCount = Math.Ceiling(total.ObjToDecimal() / pageSize.ObjToDecimal()).ObjToInt(); + return new PageData(page, pageCount, total, pageSize, items); } } \ No newline at end of file diff --git a/src/Infrastructure/Repository/Mongo/MongoServiceBase.cs b/src/Infrastructure/Repository/Mongo/MongoServiceBase.cs new file mode 100644 index 0000000..aef7de2 --- /dev/null +++ b/src/Infrastructure/Repository/Mongo/MongoServiceBase.cs @@ -0,0 +1,73 @@ +using MongoDB.Driver; + +namespace Infrastructure.Repository.Mongo; + +public abstract class MongoServiceBase(IMongoRepositoryBase repositoryBase) + : IMongoServiceBase + where TEntity : class, IIdentifiable, new() + where TKey : IEquatable +{ + public IMongoRepositoryBase DAL { get; set; } = repositoryBase; + + public async Task AddAsync(TEntity entity) + { + await DAL.AddAsync(entity); + } + + public async Task AddManyAsync(IEnumerable entities) + { + await DAL.AddManyAsync(entities); + } + + public async Task GetAsync(TKey id) + { + return await DAL.GetAsync(id); + } + + public async Task?> GetListAsync() + { + return await DAL.GetListAsync(); + } + + public async Task GetByObjectIdAsync(string id) + { + return await DAL.GetByObjectIdAsync(id); + } + + public async Task GetFirstOrDefaultAsync(Expression> predicate) + { + return await DAL.GetFirstOrDefaultAsync(predicate); + } + + public async Task?> GetListAsync(Expression> predicate) + { + return await DAL.GetListAsync(predicate); + } + + public async Task?> GetListFilterAsync(FilterDefinition filter) + { + return await DAL.GetListFilterAsync(filter); + } + + public async Task UpdateAsync(TKey id, TEntity entity) + { + return await DAL.UpdateAsync(id, entity); + } + + public async Task DeleteAsync(TKey id) + { + return await DAL.DeleteAsync(id); + } + + public async Task DeleteManyAsync(Expression> predicate) + { + return await DAL.DeleteManyAsync(predicate); + } + + public async Task?> GetPageDataAsync(int page, int pageSize, + Expression>? filter = null, Expression>? orderBy = null, + bool ascending = false) + { + return await DAL.GetPageDataAsync(page, pageSize, filter, orderBy, ascending); + } +} \ No newline at end of file