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

快速上手ASP .NET Core 8与MongoDB整合

话不多说,先了解一下MongoDB,在后端服务中选择一个数据库,是由最适合项目应用场景的架构决策所决定的。在做出决策前就需要了解和学习数据库的相关特性,从数据库官网学习了解它的特性是最适合不过的了。

MongoDB官方手册网站:MongoDB是什么? - 数据库手册 - MongoDB Docs

MongoDB .NET/C# 驱动程序手册网站:快速入门 - C#/.NET 驱动程序 v3.4 - MongoDB Docs

1、添加MongoDB.Driver

dotnet add package MongoDB.Driver

2、添加MongoDB配置信息到appsettings.json中

"MongoDBConfig": {"BooksCollectionName": "Book","DatabaseName": "BookStoreDB","ConnectionString": "mongodb://localhost:27017/",
}

3、创建MongoDB配置信息类

public class MongoDBConfig
{public string BookCollectionName { get; set; } = string.Empty;public string DatabaseName { get; set; } = string.Empty;public string ConnectionString { get; set; } = string.Empty;
}

4、创建实体类-Book

public class Book
{[BsonId][BsonRepresentation(BsonType.ObjectId)]public string Id { get; set; } = ObjectId.GenerateNewId().ToString();[BsonElement("Name")]public string BookName { get; set; } = string.Empty;public decimal Price { get; set; }public string Category { get; set; } = string.Empty;public string Author { get; set; } = string.Empty;[BsonDateTimeOptions(Kind = DateTimeKind.Local)]public DateTime CreationTime { get; set; } = DateTime.Now;
}

注:[BsonDateTimeOptions(Kind = DateTimeKind.Local)]必须要添加的,因为MongoDB写入时间是协调世界时(UTC),不加这样注解,查询出来结果会有时区误差。

5、创建自定义MongoDB上下文

public class MongoDBContext
{public IMongoCollection<Book> Books { get; }public MongoDBContext(MongoDBConfig mongodbConfig){if (mongodbConfig != null){if (string.IsNullOrEmpty(mongodbConfig.ConnectionString))throw new ArgumentException("MongoDB connection is not configured");var client = new MongoClient(mongodbConfig.ConnectionString);var database = client.GetDatabase(mongodbConfig.DatabaseName);Books = database.GetCollection<User>(mongodbConfig.BookCollectionName);}else{throw new ArgumentNullException(nameof(mongodbConfig));}}
}

6、创建自定义MongoDB扩展注入服务

public static class MongoDBServiceExtensions
{public static IServiceCollection AddMongoDB(this IServiceCollection services, IConfiguration configuration){services.Configure<MongoDBConfig>(configuration.GetSection("MongoDBConfig"));services.AddSingleton<MongoDBContext>(provider =>{var settings = configuration.GetSection("MongoDBConfig").Get<MongoDBConfig>();return settings == null? throw new InvalidOperationException("MongoDBConfig is not configured properly."): new MongoDBContext(settings);});return services;}
}

注:这里为什么会将MongoDBContext注册为单例服务,因为官方文档推荐单例模式

7、Program.cs文件中注入MongoDB

builder.Services.AddMongoDB(builder.Configuration);

8、使用MongoDB

[ApiController]
[Route("api/[controller]")]public class BookController : ControllerBase
{private readonly ILogger<BookController> _logger;private readonly MongoDBContext _mongodbContext;public BookController(MongoDBContext mongodbContext, ILogger<BookController> logger){_logger = logger;_mongodbContext = mongodbContext;}[HttpGet]public async Task<List<Book>> GetList(){return await _mongodbContext.Books.Find(_ => true).ToListAsync();}[HttpGet("{id:length(24)}")]public async Task<ActionResult<Book>> Get(string id){var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();if (book is null){return NotFound();}return book;}[HttpPost]public async Task<IActionResult> Post(Book newBook){await _mongodbContext.Books.InsertOneAsync(newBook);return CreatedAtAction(nameof(Get), new { id = newBook.Id }, newBook);}[HttpPut("{id:length(24)}")]public async Task<IActionResult> Update(string id, Book updatedBook){var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();if (book is null){return NotFound();}updatedBook.Id = book.Id;await _mongodbContext.Books.ReplaceOneAsync(x => x.Id == id, updatedBook); ;return NoContent();}[HttpDelete("{id:length(24)}")]public async Task<IActionResult> Delete(string id){var book = await _mongodbContext.Books.Find(x => x.Id == id).FirstOrDefaultAsync();if (book is null){return NotFound();}await _mongodbContext.Books.DeleteOneAsync(x => x.Id == id);return NoContent();}
}

 

http://www.dtcms.com/a/273029.html

相关文章:

  • 200W 以内的伺服电机 典型应用场景
  • C语言顺序表:从零开始,解锁数据结构之门!
  • YOLO系列pt导出不同onnx方法
  • Renren框架DistributeLock排他锁实现详解
  • 企业内网系统:从传统开发到智能赋能的进化之路
  • 安达发|医疗器械行业APS自动排单:智能化生产管理的未来之路
  • useRef跨渲染周期存储
  • 数据结构 --- 队列
  • 10.Docker安装mysql
  • chatgpt是怎么诞生的,详解GPT1到GPT4的演化之路及相关背景知识
  • dexie 前端数据库封装
  • 使用快捷键迅速校准多个通道 | IPEmotion
  • 软件技术:柯里化
  • 《PyQt6-3D应用开发技术文档》
  • 仿豆包智能输入框实现
  • python基础25_某大网校(下)处理json数据以及保存题库
  • 安全访问云端内部应用:用frp的stcp功能解决SSH转发的痛点
  • Linux驱动开发(platform 设备驱动)
  • 老题新解|矩阵转置
  • AI驱动的业务系统智能化转型:从非结构化到结构化的智能转换
  • 【STM32 学习笔记】FLASH闪存
  • pytorch学习-12循环神经网络(基础篇)
  • 机器视觉之激光码检测系统
  • 【世纪龙科技】学测-汽车信息化综合实训考核平台(机电方向)
  • 数字孪生系统如何助力汽车零部件企业实现虚拟智控
  • RedisJSON 内存占用剖析与调优
  • Lua嵌入式爬虫实现步骤
  • 【Linux系统】冯诺依曼体系结构 | 初识操作系统
  • 生产者、消费者问题(C语言、POSIX)
  • 测试覆盖标准-条件覆盖-短路求值