当前位置: 首页 > news >正文

做一公司网站济南莱芜金点子信息港

做一公司网站,济南莱芜金点子信息港,百度关键词查询排名怎么查,公司网站被百度收录前言 上一章我们把系统所需要的MongoDB集合设计好了#xff0c;这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式#xff0c;因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式#xff08;R…前言 上一章我们把系统所需要的MongoDB集合设计好了这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式Repository 带来的好处是一套代码可以适用于多个类把常用的CRUD通用方法抽象出来通过接口形式集中管理从而解除业务逻辑层与数据访问层之间的耦合使业务逻辑层在存储、访问数据库时无须关心数据的来源及存储方式。工作单元模式UnitOfWork它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表跨多个请求的业务统一管理事务统一提交从而保障事物一致性的作用。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之MongoDB快速入门 MongoDB从入门到实战之Docker快速安装MongoDB MongoDB从入门到实战之MongoDB工作常用操作命令 MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统1-后端项目框架搭建 MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统2-Swagger框架集成 MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统3-系统数据集合设计 MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统4-MongoDB数据仓储和工作单元模式封装 YyFlight.ToDoList项目源码地址 欢迎各位看官老爷review有帮助的别忘了给我个Star哦 GitHub地址GitHub - YSGStudyHards/YyFlight.ToDoList: 【.NET8 MongoDB 待办清单系统】.NET8 MongoDB从入门到实战基础教程该项目后端使用的是.NET8、前端页面使用Blazor、使用MongoDB存储数据更多相关内容大家可以看目录中的MongoDB从入门到实战的相关教程。该系列教程可作为.NET Core入门项目进行学习感兴趣的小伙伴可以关注博主和我一起学习共同进步。 MongoRepository地址https://github.com/YSGStudyHards/YyFlight.ToDoList/tree/main/Repository/Repository MongoDB事务使用前提说明 参阅MongoDB的事务 说明 MongoDB单机服务器不支持事务【使用MongoDB事务会报错Standalone servers do not support transactions】,只有在集群情况下才支持事务因为博主接下来都是在单机环境下操作所以无法来演示Mongo事务操作但是方法都已经是封装好了的大家可以自己搭建集群实操。 原因 MongoDB在使用分布式事务时需要进行多节点之间的协调和通信而单机环境下无法实现这样的分布式协调和通信机制。但是在MongoDB部署为一个集群cluster后将多个计算机连接为一个整体通过协调和通信机制实现了分布式事务的正常使用。从数据一致性和可靠性的角度来看在分布式系统中实现事务处理是至关重要的。而在单机环境下不支持事务只有在集群情况下才支持事务的设计方式是为了保证数据一致性和可靠性并且也符合分布式系统的设计思想。 MongoDB.Driver驱动安装 1、直接命令自动安装 Install-Package MongoDB.Driver 2、搜索Nuget手动安装 MongoSettings数据库连接配置 前往appsettings.json文件中配置Mongo数据库信息 MongoSettings: {Connection: mongodb://root:123456local:27017/yyflight_todolist?authSourceadmin, //MongoDB连接字符串DatabaseName: yyflight_todolist //MongoDB数据库名称} 定义单例的MongoClient 基于MongoDB的最佳实践对于MongoClient最好设置为单例注入因为在MongoDB.Driver中MongoClient已经被设计为线程安全可以被多线程共享这样可还以避免反复实例化MongoClient带来的开销避免在极端情况下的性能低下。 我们这里设计一个MongoConnection类用于包裹这个MongoClient然后将其以单例模式注入IoC容器中。 定义IMongoConnection接口 public interface IMongoConnection{public MongoClient MongoDBClient { get; set; }public IMongoDatabase DatabaseName { get; set; }} 定义MongoConnection类 public class MongoConnection : IMongoConnection{//基于MongoDB的最佳实践对于MongoClient最好设置为单例注入因为在MongoDB.Driver中MongoClient已经被设计为线程安全可以被多线程共享这样可还以避免反复实例化MongoClient带来的开销避免在极端情况下的性能低下。//我们这里设计一个MongoConnection类用于包裹这个MongoClient然后将其以单例模式注入IoC容器中。public MongoClient MongoDBClient { get; set; }public IMongoDatabase DatabaseName { get; set; }public MongoConnection(IConfiguration configuration){MongoDBClient new MongoClient(configuration[MongoSettings:Connection]);DatabaseName MongoDBClient.GetDatabase(configuration[MongoSettings:DatabaseName]);}} 定义Mongo DBContext上下文 现在我们将定义MongoDB DBContext上下文类具体到一个业务对象或需要被持久化的对象这个上下文类将封装数据库的连接和集合。 该类应负责建立与所需数据库的连接在建立连接后该类将在内存中或按请求持有数据库上下文基于API管道中配置的生命周期管理。 定义IMongoContext接口  public interface IMongoContext : IDisposable{/// summary/// 添加命令操作/// /summary/// param namefunc委托 方法接受一个 FuncIClientSessionHandle, Task 委托作为参数该委托表示一个需要 IClientSessionHandle 对象作为参数并返回一个异步任务的方法/param/// returns/returnsTask AddCommandAsync(FuncIClientSessionHandle, Task func);/// summary/// 提交更改并返回受影响的行数/// TODOMongoDB单机服务器不支持事务【使用MongoDB事务会报错Standalone servers do not support transactions】,只有在集群情况下才支持事务/// 原因MongoDB在使用分布式事务时需要进行多节点之间的协调和通信而单机环境下无法实现这样的分布式协调和通信机制。但是在MongoDB部署为一个集群cluster后将多个计算机连接为一个整体通过协调和通信机制实现了分布式事务的正常使用。从数据一致性和可靠性的角度来看在分布式系统中实现事务处理是至关重要的。而在单机环境下不支持事务只有在集群情况下才支持事务的设计方式是为了保证数据一致性和可靠性并且也符合分布式系统的设计思想。/// /summary/// param namesessionMongoDB 会话session对象/param/// returns/returnsTaskint SaveChangesAsync(IClientSessionHandle session);/// summary/// 初始化Mongodb会话对象session/// /summary/// returns/returnsTaskIClientSessionHandle StartSessionAsync();/// summary/// 获取集合数据/// /summary/// typeparam nameT/typeparam/// param namename/param/// returns/returnsIMongoCollectionT GetCollectionT(string name);} 定义MongoContext类 public class MongoContext : IMongoContext{private readonly IMongoDatabase _databaseName;private readonly MongoClient _mongoClient;//这里将 _commands 中的每个元素都定义为一个 FuncIClientSessionHandle, Task 委托此委托表示一个需要 IClientSessionHandle 对象作为参数并返回一个异步任务的方法//每个委托都表示一个MongoDB 会话session对象和要执行的命令private readonly ListFuncIClientSessionHandle, Task _commands new ListFuncIClientSessionHandle, Task();public MongoContext(IMongoConnection mongoConnection){_mongoClient mongoConnection.MongoDBClient;_databaseName mongoConnection.DatabaseName;}/// summary/// 添加命令操作/// /summary/// param namefunc方法接受一个 FuncIClientSessionHandle, Task 委托作为参数该委托表示一个需要 IClientSessionHandle 对象作为参数并返回一个异步任务的方法/param/// returns/returnspublic async Task AddCommandAsync(FuncIClientSessionHandle, Task func){_commands.Add(func);await Task.CompletedTask;}/// summary/// 提交更改并返回受影响的行数/// TODOMongoDB单机服务器不支持事务【使用MongoDB事务会报错Standalone servers do not support transactions】,只有在集群情况下才支持事务/// 原因MongoDB在使用分布式事务时需要进行多节点之间的协调和通信而单机环境下无法实现这样的分布式协调和通信机制。但是在MongoDB部署为一个集群cluster后将多个计算机连接为一个整体通过协调和通信机制实现了分布式事务的正常使用。从数据一致性和可靠性的角度来看在分布式系统中实现事务处理是至关重要的。而在单机环境下不支持事务只有在集群情况下才支持事务的设计方式是为了保证数据一致性和可靠性并且也符合分布式系统的设计思想。/// /summary/// param namesessionMongoDB 会话session对象/param/// returns/returnspublic async Taskint SaveChangesAsync(IClientSessionHandle session){try{session.StartTransaction();//开始事务foreach (var command in _commands){await command(session);//语句实现了对事务中所有操作的异步执行并等待它们完成。如果没有错误发生程序会继续执行session.CommitTransactionAsync();方法将之前进行的所有更改一起提交到MongoDB服务器上从而实现事务提交。}await session.CommitTransactionAsync();//提交事务return _commands.Count;}catch (Exception ex){await session.AbortTransactionAsync();//回滚事务return 0;}finally{_commands.Clear();//清空_commands列表中的元素}}/// summary/// 初始化Mongodb会话对象session/// /summary/// returns/returnspublic async TaskIClientSessionHandle StartSessionAsync(){var session await _mongoClient.StartSessionAsync();return session;}/// summary/// 获取MongoDB集合/// /summary/// typeparam nameT/typeparam/// param namename集合名称/param/// returns/returnspublic IMongoCollectionT GetCollectionT(string name){return _databaseName.GetCollectionT(name);}/// summary/// 释放上下文/// /summarypublic void Dispose(){GC.SuppressFinalize(this);}} 定义通用泛型Repository Repository(仓储)是DDD(领域驱动设计)中的经典思想可以归纳为介于实际业务层(领域层)和数据访问层之间的层能让领域层能在感觉不到数据访问层的情况下完成与数据库的交互和以往的DAO(数据访问)层相比Repository层的设计理念更偏向于面向对象而淡化直接对数据表进行的CRUD操作。 定义IMongoRepository接口 定义一个泛型Repository通用接口抽象常用的增加删除修改查询等操作方法。 public interface IMongoRepositoryT where T : class, new(){#region 事务操作示例/// summary/// 事务添加数据/// /summary/// param namesessionMongoDB 会话session对象/param/// param nameobjData添加数据/param/// returns/returnsTask AddTransactionsAsync(IClientSessionHandle session, T objData);/// summary/// 事务数据删除/// /summary/// param namesessionMongoDB 会话session对象/param/// param nameidobjectId/param/// returns/returnsTask DeleteTransactionsAsync(IClientSessionHandle session, string id);/// summary/// 事务异步局部更新仅更新一条记录/// /summary/// param namesessionMongoDB 会话session对象/param/// param namefilter过滤器/param/// param nameupdate更新条件/param/// returns/returnsTask UpdateTransactionsAsync(IClientSessionHandle session, FilterDefinitionT filter, UpdateDefinitionT update);#endregion#region 添加相关操作/// summary/// 添加数据/// /summary/// param nameobjData添加数据/param/// returns/returnsTask AddAsync(T objData);/// summary/// 批量插入/// /summary/// param nameobjDatas实体集合/param/// returns/returnsTask InsertManyAsync(ListT objDatas);#endregion#region 删除相关操作/// summary/// 数据删除/// /summary/// param nameidobjectId/param/// returns/returnsTask DeleteAsync(string id);/// summary/// 异步删除多条数据/// /summary/// param namefilter删除的条件/param/// returns/returnsTaskDeleteResult DeleteManyAsync(FilterDefinitionT filter);#endregion#region 修改相关操作/// summary/// 指定对象异步修改一条数据/// /summary/// param nameobj要修改的对象/param/// param nameid修改条件/param/// returns/returnsTask UpdateAsync(T obj, string id);/// summary/// 局部更新仅更新一条记录/// para![CDATA[expression 参数示例x x.Id 1 x.Age 18 x.Gender 0]]/para/// para![CDATA[entity 参数示例y new T{ RealName Ray, Gender 1}]]/para/// /summary/// param nameexpression筛选条件/param/// param nameentity更新条件/param/// returns/returnsTask UpdateAsync(ExpressionFuncT, bool expression, ExpressionActionT entity);/// summary/// 异步局部更新仅更新一条记录/// /summary/// param namefilter过滤器/param/// param nameupdate更新条件/param/// returns/returnsTask UpdateAsync(FilterDefinitionT filter, UpdateDefinitionT update);/// summary/// 异步局部更新仅更新多条记录/// /summary/// param nameexpression筛选条件/param/// param nameupdate更新条件/param/// returns/returnsTask UpdateManyAsync(ExpressionFuncT, bool expression, UpdateDefinitionT update);/// summary/// 异步批量修改数据/// /summary/// param namedic要修改的字段/param/// param namefilter更新条件/param/// returns/returnsTaskUpdateResult UpdateManayAsync(Dictionarystring, string dic, FilterDefinitionT filter);#endregion#region 查询统计相关操作/// summary/// 通过ID主键获取数据/// /summary/// param nameidobjectId/param/// returns/returnsTaskT GetByIdAsync(string id);/// summary/// 获取所有数据/// /summary/// returns/returnsTaskIEnumerableT GetAllAsync();/// summary/// 获取记录数/// /summary/// param nameexpression筛选条件/param/// returns/returnsTasklong CountAsync(ExpressionFuncT, bool expression);/// summary/// 获取记录数/// /summary/// param namefilter过滤器/param/// returns/returnsTasklong CountAsync(FilterDefinitionT filter);/// summary/// 判断是否存在/// /summary/// param namepredicate条件/param/// returns/returnsTaskbool ExistsAsync(ExpressionFuncT, bool predicate);/// summary/// 异步查询集合/// /summary/// param namefilter查询条件/param/// param namefield要查询的字段,不写时查询全部/param/// param namesort要排序的字段/param/// returns/returnsTaskListT FindListAsync(FilterDefinitionT filter, string[]? field null, SortDefinitionT? sort null);/// summary/// 异步分页查询集合/// /summary/// param namefilter查询条件/param/// param namepageIndex当前页/param/// param namepageSize页容量/param/// param namefield要查询的字段,不写时查询全部/param/// param namesort要排序的字段/param/// returns/returnsTaskListT FindListByPageAsync(FilterDefinitionT filter, int pageIndex, int pageSize, string[]? field null, SortDefinitionT? sort null);#endregion} 实现泛型MongoBaseRepository基类 public class MongoBaseRepositoryT : IMongoRepositoryT where T : class, new(){protected readonly IMongoContext _context;protected readonly IMongoCollectionT _dbSet;private readonly string _collectionName;protected MongoBaseRepository(IMongoContext context){_context context;_collectionName typeof(T).GetAttributeValue((TableAttribute m) m.Name) ?? typeof(T).Name;_dbSet _context.GetCollectionT(_collectionName);}#region 事务操作示例/// summary/// 事务添加数据/// /summary/// param namesessionMongoDB 会话session对象/param/// param nameobjData添加数据/param/// returns/returnspublic async Task AddTransactionsAsync(IClientSessionHandle session, T objData){await _context.AddCommandAsync(async (session) await _dbSet.InsertOneAsync(objData));}/// summary/// 事务数据删除/// /summary/// param namesessionMongoDB 会话session对象/param/// param nameidobjectId/param/// returns/returnspublic async Task DeleteTransactionsAsync(IClientSessionHandle session, string id){await _context.AddCommandAsync((session) _dbSet.DeleteOneAsync(BuildersT.Filter.Eq( _id , id)));}/// summary/// 事务异步局部更新仅更新一条记录/// /summary/// param namesessionMongoDB 会话session对象/param/// param namefilter过滤器/param/// param nameupdate更新条件/param/// returns/returnspublic async Task UpdateTransactionsAsync(IClientSessionHandle session, FilterDefinitionT filter, UpdateDefinitionT update){await _context.AddCommandAsync((session) _dbSet.UpdateOneAsync(filter, update));}#endregion#region 添加相关操作/// summary/// 添加数据/// /summary/// param nameobjData添加数据/param/// returns/returnspublic async Task AddAsync(T objData){await _dbSet.InsertOneAsync(objData);}/// summary/// 批量插入/// /summary/// param nameobjDatas实体集合/param/// returns/returnspublic async Task InsertManyAsync(ListT objDatas){await _dbSet.InsertManyAsync(objDatas);}#endregion#region 删除相关操作/// summary/// 数据删除/// /summary/// param nameidobjectId/param/// returns/returnspublic async Task DeleteAsync(string id){await _dbSet.DeleteOneAsync(BuildersT.Filter.Eq(_id, new ObjectId(id)));}/// summary/// 异步删除多条数据/// /summary/// param namefilter删除的条件/param/// returns/returnspublic async TaskDeleteResult DeleteManyAsync(FilterDefinitionT filter){return await _dbSet.DeleteManyAsync(filter);}#endregion#region 修改相关操作/// summary/// 指定对象异步修改一条数据/// /summary/// param nameobj要修改的对象/param/// param nameid修改条件/param/// returns/returnspublic async Task UpdateAsync(T obj, string id){//修改条件FilterDefinitionT filter BuildersT.Filter.Eq(_id, new ObjectId(id));//要修改的字段var list new ListUpdateDefinitionT();foreach (var item in obj.GetType().GetProperties()){if (item.Name.ToLower() id) continue;list.Add(BuildersT.Update.Set(item.Name, item.GetValue(obj)));}var updatefilter BuildersT.Update.Combine(list);await _dbSet.UpdateOneAsync(filter, updatefilter);}/// summary/// 局部更新仅更新一条记录/// para![CDATA[expression 参数示例x x.Id 1 x.Age 18 x.Gender 0]]/para/// para![CDATA[entity 参数示例y new T{ RealName Ray, Gender 1}]]/para/// /summary/// param nameexpression筛选条件/param/// param nameentity更新条件/param/// returns/returnspublic async Task UpdateAsync(ExpressionFuncT, bool expression, ExpressionActionT entity){var fieldList new ListUpdateDefinitionT();if (entity.Body is MemberInitExpression param){foreach (var item in param.Bindings){var propertyName item.Member.Name;object propertyValue null;if (item is not MemberAssignment memberAssignment) continue;if (memberAssignment.Expression.NodeType ExpressionType.Constant){if (memberAssignment.Expression is ConstantExpression constantExpression)propertyValue constantExpression.Value;}else{propertyValue Expression.Lambda(memberAssignment.Expression, null).Compile().DynamicInvoke();}if (propertyName ! _id) //实体键_id不允许更新{fieldList.Add(BuildersT.Update.Set(propertyName, propertyValue));}}}await _dbSet.UpdateOneAsync(expression, BuildersT.Update.Combine(fieldList));}/// summary/// 异步局部更新仅更新一条记录/// /summary/// param namefilter过滤器/param/// param nameupdate更新条件/param/// returns/returnspublic async Task UpdateAsync(FilterDefinitionT filter, UpdateDefinitionT update){await _dbSet.UpdateOneAsync(filter, update);}/// summary/// 异步局部更新仅更新多条记录/// /summary/// param nameexpression筛选条件/param/// param nameupdate更新条件/param/// returns/returnspublic async Task UpdateManyAsync(ExpressionFuncT, bool expression, UpdateDefinitionT update){await _dbSet.UpdateManyAsync(expression, update);}/// summary/// 异步批量修改数据/// /summary/// param namedic要修改的字段/param/// param namefilter更新条件/param/// returns/returnspublic async TaskUpdateResult UpdateManayAsync(Dictionarystring, string dic, FilterDefinitionT filter){T t new T();//要修改的字段var list new ListUpdateDefinitionT();foreach (var item in t.GetType().GetProperties()){if (!dic.ContainsKey(item.Name)) continue;var value dic[item.Name];list.Add(BuildersT.Update.Set(item.Name, value));}var updatefilter BuildersT.Update.Combine(list);return await _dbSet.UpdateManyAsync(filter, updatefilter);}#endregion#region 查询统计相关操作/// summary/// 通过ID主键获取数据/// /summary/// param nameidobjectId/param/// returns/returnspublic async TaskT GetByIdAsync(string id){var queryData await _dbSet.FindAsync(BuildersT.Filter.Eq(_id, new ObjectId(id)));return queryData.FirstOrDefault();}/// summary/// 获取所有数据/// /summary/// returns/returnspublic async TaskIEnumerableT GetAllAsync(){var queryAllData await _dbSet.FindAsync(BuildersT.Filter.Empty);return queryAllData.ToList();}/// summary/// 获取记录数/// /summary/// param nameexpression筛选条件/param/// returns/returnspublic async Tasklong CountAsync(ExpressionFuncT, bool expression){return await _dbSet.CountDocumentsAsync(expression);}/// summary/// 获取记录数/// /summary/// param namefilter过滤器/param/// returns/returnspublic async Tasklong CountAsync(FilterDefinitionT filter){return await _dbSet.CountDocumentsAsync(filter);}/// summary/// 判断是否存在/// /summary/// param namepredicate条件/param/// returns/returnspublic async Taskbool ExistsAsync(ExpressionFuncT, bool predicate){return await Task.FromResult(_dbSet.AsQueryable().Any(predicate));}/// summary/// 异步查询集合/// /summary/// param namefilter查询条件/param/// param namefield要查询的字段,不写时查询全部/param/// param namesort要排序的字段/param/// returns/returnspublic async TaskListT FindListAsync(FilterDefinitionT filter, string[]? field null, SortDefinitionT? sort null){//不指定查询字段if (field null || field.Length 0){if (sort null) return await _dbSet.Find(filter).ToListAsync();return await _dbSet.Find(filter).Sort(sort).ToListAsync();}//指定查询字段var fieldList new ListProjectionDefinitionT();for (int i 0; i field.Length; i){fieldList.Add(BuildersT.Projection.Include(field[i].ToString()));}var projection BuildersT.Projection.Combine(fieldList);fieldList?.Clear();//不排序if (sort null) return await _dbSet.Find(filter).ProjectT(projection).ToListAsync();//排序查询return await _dbSet.Find(filter).Sort(sort).ProjectT(projection).ToListAsync();}/// summary/// 异步分页查询集合/// /summary/// param namefilter查询条件/param/// param namepageIndex当前页/param/// param namepageSize页容量/param/// param namefield要查询的字段,不写时查询全部/param/// param namesort要排序的字段/param/// returns/returnspublic async TaskListT FindListByPageAsync(FilterDefinitionT filter, int pageIndex, int pageSize, string[]? field null, SortDefinitionT? sort null){//不指定查询字段if (field null || field.Length 0){if (sort null) return await _dbSet.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();//进行排序return await _dbSet.Find(filter).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();}//指定查询字段var fieldList new ListProjectionDefinitionT();for (int i 0; i field.Length; i){fieldList.Add(BuildersT.Projection.Include(field[i].ToString()));}var projection BuildersT.Projection.Combine(fieldList);fieldList?.Clear();//不排序if (sort null) return await _dbSet.Find(filter).ProjectT(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();//排序查询return await _dbSet.Find(filter).Sort(sort).ProjectT(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();}#endregion} 工作单元模式 工作单元模式是“维护一个被业务事务影响的对象列表协调变化的写入和并发问题的解决”。具体来说在C#工作单元模式中我们通过UnitOfWork对象来管理多个Repository对象同时UnitOfWork还提供了对事务的支持。对于一组需要用到多个Repository的业务操作我们可以在UnitOfWork中创建一个事务并将多个Repository操作放在同一个事务中处理以保证数据的一致性。当所有Repository操作完成后再通过UnitOfWork提交事务或者回滚事务。 定义IUnitOfWork接口 /// summary/// 工作单元接口/// /summarypublic interface IUnitOfWork : IDisposable{/// summary/// 提交保存更改/// /summary/// param namesessionMongoDB 会话session对象/param/// returns/returnsTaskbool Commit(IClientSessionHandle session);/// summary/// 初始化MongoDB会话对象session/// /summary/// returns/returnsTaskIClientSessionHandle InitTransaction();} 定义UnitOfWork类 /// summary/// 工作单元类/// /summarypublic class UnitOfWork : IUnitOfWork{private readonly IMongoContext _context;public UnitOfWork(IMongoContext context){_context context;}/// summary/// 提交保存更改/// /summary/// param namesessionMongoDB 会话session对象/param/// returns/returnspublic async Taskbool Commit(IClientSessionHandle session){return await _context.SaveChangesAsync(session) 0;}/// summary/// 初始化MongoDB会话对象session/// /summary/// returns/returnspublic async TaskIClientSessionHandle InitTransaction(){return await _context.StartSessionAsync();}public void Dispose(){_context.Dispose();}} 注册数据库基础操作和工作单元 //注册数据库基础操作和工作单元 builder.Services.AddSingletonIMongoConnection, MongoConnection(); builder.Services.AddScopedIMongoContext, MongoContext(); builder.Services.AddScopedIUnitOfWork, UnitOfWork(); builder.Services.AddScopedIUserRepository, UserRepository(); 参考文章 NoSQL – MongoDB Repository Implementation in .NET Core with Unit Testing example ASP.NET CORE – MONGODB REPOSITORY PATTERN UNIT OF WORK
http://www.dnsts.com.cn/news/125062.html

相关文章:

  • 深圳线运营是网站建设从什么网站找做app的代码
  • 在家做衣服的网站中铁建设集团招聘官网
  • 做网站下载哪个软件优秀网站展示
  • vs网站制作可拖拽 网站建设
  • 大兴企业网站建设公司平台设计思路
  • 保健品网站源代码银河盛世网站建设
  • 易语言可以做网站么贵州省健康码二维码图片下载
  • 学校网站群管理系统建设项目网站建设中网站需求分析报告
  • 搭建一个企业网站需要多少钱服务器搭建网站软件
  • 网站外链价格wordpress小子邀请码
  • 网站开发团队奖惩用手机如何制作网页链接
  • asp flash网站模板360网站怎么建设
  • 搜寻的网站有哪些wordpress数据表格作用
  • 私人网站建设方案书框架栏目免费的黄台直播
  • 在苏州找学生做家教在哪个网站有哪些是外国人做的网站
  • 建设银行网站储蓄账户查询密码马云做黄页网站时候
  • 张艺兴粉丝做的网站alexa排名怎么查
  • 沈阳关键词网站排名wordpress进不去数据库
  • 网站建设服务器对比东莞做网站优化
  • 网站支持ipv6怎么做南宁网站建设醉懂网络
  • 小程序变成网页链接sem优化公司
  • 自建网站费用做电影下载网站需要什么软件
  • 建企业网站要多少钱金华建设银行网站
  • xv10相同网站建立网站的技术路径
  • 如何在网站网站做代理网络舆情分析的内容
  • 网站改备案信息吗跨境电商免费平台有哪些
  • 最佳商城ui网站设计网页设计与制作课程心得
  • 网站建设指导思想和目标网站设计集团
  • 郴州文明网网站石家庄最新事件
  • 做网站建设费用预算网站设计实施