使用 ASP.NET Core 和 MongoDB 创建 Web API
本教程创建对 MongoDB NoSQL 数据库执行创建、读取、更新和删除 (CRUD) 操作的 Web API。
在本教程中,你将了解:
- 配置 MongoDB
- 创建 MongoDB 数据库
- 定义 MongoDB 集合和架构
- 从 Web API 执行 MongoDB CRUD 操作
系统必备
- .NET Core SDK 2.2 或更高版本
- 已安装“ASP.NET 和 Web 开发”工作负载的 Visual Studio 2017 版本 15.9 或更高版本
- MongoDB
配置 MongoDB
如果使用的是 Windows,MongoDB 将默认安装在 C:\Program Files\MongoDB 中。 将 C:\Program Files\MongoDB\Server\<version_number>\bin 添加到 Path 环境变量中。 通过此更改可以从开发计算机上的任意位置访问 MongoDB。
使用以下步骤中的 mongo Shell 可以创建数据库、创建集合和存储文档。 有关 mongo Shell 命令的详细信息,请参阅使用 mongo Shell。
- 选择开发计算机上用于存储数据的目录。 例如,Windows 上的 C:\BooksData。 创建目录(如果不存在)。 mongo Shell 不会创建新目录。
- 打开命令行界面。 运行以下命令以连接到默认端口 27017 上的 MongoDB。 请记得将 <data_directory_path> 替换为上一步中选择的目录。console复制mongod --dbpath <data_directory_path>
- 打开另一个命令行界面实例。 通过运行以下命令来连接到默认测试数据库:console复制mongo
- 在命令行界面中运行下面的命令:console复制use BookstoreDb 如果该命令尚不存在,则将创建名为 BookstoreDb 的数据库。 如果该数据库存在,则将为事务打开其连接。
- 使用以下命令创建 Books 集合:console复制db.createCollection('Books') 显示以下结果:console复制{ "ok" : 1 }
- 使用以下命令定义 Books 集合的架构并插入两个文档:console复制db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}]) 显示以下结果:console复制{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
- 使用以下命令查看数据库中的文档:console复制db.Books.find({}).pretty() 显示以下结果:console复制{ "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" } { "_id" : ObjectId("5bfd996f7b8e48dc15ff215e"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" } 该架构将为每个文档添加类型 ObjectId 的自动生成的 _id 属性。
数据库可供使用了。 你可以开始创建 ASP.NET Core Web API。
创建 ASP.NET Core Web API 项目
转到“文件” > “新建” > “项目”。
选择“ASP.NET Core Web 应用程序”,将项目命名为“BooksApi”,然后单击“确定”。
选择“.NET Core”目标框架和“ASP.NET Core 2.2”。 选择“API”项目模板,然后单击“确定”:
访问 NuGet 库:MongoDB.Driver 来确定适用于 MongoDB 的 .NET 驱动程序的最新稳定版本。 在“包管理器控制台”窗口中,导航到项目根。 运行以下命令以安装适用于 MongoDB 的 .NET 驱动程序:
PowerShellInstall-Package MongoDB.Driver -Version {VERSION}
添加模型
- 将 Models 目录添加到项目根。
- 使用以下代码将 Book 类添加到 Models 目录:C#复制using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace BooksApi.Models { public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("Name")] public string BookName { get; set; } [BsonElement("Price")] public decimal Price { get; set; } [BsonElement("Category")] public string Category { get; set; } [BsonElement("Author")] public string Author { get; set; } } }
在前面的类中,Id属性:
- 需要在将公共语言运行时 (CLR) 对象映射到 MongoDB 集合时使用。
- 使用 [BsonId] 进行批注,以将此属性指定为文档的主键。
- 使用 [BsonRepresentation(BsonType.ObjectId)] 进行批注,以允许将参数作为类型 string而非 ObjectId 传递。 Mongo 处理从 string 到 ObjectId 的转换。
类中的其他属性使用 [BsonElement] 属性进行批注。 该属性的值表示 MongoDB 集合中的属性名称。
添加 CRUD 操作类
- 将 Services 目录添加到项目根。
- 使用以下代码将 BookService 类添加到 Services 目录:C#复制using System.Collections.Generic; using System.Linq; using BooksApi.Models; using Microsoft.Extensions.Configuration; using MongoDB.Driver; namespace BooksApi.Services { public class BookService { private readonly IMongoCollection<Book> _books; public BookService(IConfiguration config) { var client = new MongoClient(config.GetConnectionString("BookstoreDb")); var database = client.GetDatabase("BookstoreDb"); _books = database.GetCollection<Book>("Books"); } public List<Book> Get() { return _books.Find(book => true).ToList(); } public Book Get(string id) { return _books.Find<Book>(book => book.Id == id).FirstOrDefault(); } public Book Create(Book book) { _books.InsertOne(book); return book; } public void Update(string id, Book bookIn) { _books.ReplaceOne(book => book.Id == id, bookIn); } public void Remove(Book bookIn) { _books.DeleteOne(book => book.Id == bookIn.Id); } public void Remove(string id) { _books.DeleteOne(book => book.Id == id); } } }
- 将 MongoDB 连接字符串添加到 appsettings.json:C#复制{ "ConnectionStrings": { "BookstoreDb": "mongodb://localhost:27017" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } } 将在 BookService 类构造函数中访问前面的 BookstoreDb 属性。
- 在 Startup.ConfigureServices 中,向依赖关系注入系统注册 BookService 类:C#复制public void ConfigureServices(IServiceCollection services) { services.AddScoped<BookService>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } 必须执行前面的服务注册才能支持消费类中的构造函数注入。
BookService 类使用以下 MongoDB.Driver 成员对数据库执行 CRUD 操作:
- MongoClient – 读取执行数据库操作的服务器实例。 此类的构造函数提供了 MongoDB 连接字符串:C#复制public BookService(IConfiguration config) { var client = new MongoClient(config.GetConnectionString("BookstoreDb")); var database = client.GetDatabase("BookstoreDb"); _books = database.GetCollection<Book>("Books"); }
- IMongoDatabase – 表示用于执行操作的 Mongo 数据库。 本教程在界面上使用泛型 GetCollection<T>(collection) 方法来获取对特定集合中的数据的访问。 调用此方法后,可以对集合执行 CRUD 操作。 在 GetCollection<T>(collection) 方法调用中:collection 表示集合名称。T 表示存储在集合中的 CLR 对象类型。
GetCollection<T>(collection) 返回 MongoCollection 对象,该对象表示集合。 在本教程中,对集合调用以下方法:
- Find<T> – 返回集合中与提供的搜索条件匹配的所有文档。
- InsertOne – 插入提供的对象作为集合中的新文档。
- ReplaceOne – 将与提供的搜索条件匹配的单个文档替换为提供的对象。
- DeleteOne – 删除与提供的搜索条件匹配的单个文档。
添加控制器
- 使用以下代码将 BooksController 类添加到 Controllers 目录:C#复制using System.Collections.Generic; using BooksApi.Models; using BooksApi.Services; using Microsoft.AspNetCore.Mvc; namespace BooksApi.Controllers { [Route("api/[controller]")] [ApiController] public class BooksController : ControllerBase { private readonly BookService _bookService; public BooksController(BookService bookService) { _bookService = bookService; } [HttpGet] public ActionResult<List<Book>> Get() { return _bookService.Get(); } [HttpGet("{id:length(24)}", Name = "GetBook")] public ActionResult<Book> Get(string id) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } return book; } [HttpPost] public ActionResult<Book> Create(Book book) { _bookService.Create(book); return CreatedAtRoute("GetBook", new { id = book.Id.ToString() }, book); } [HttpPut("{id:length(24)}")] public IActionResult Update(string id, Book bookIn) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } _bookService.Update(id, bookIn); return NoContent(); } [HttpDelete("{id:length(24)}")] public IActionResult Delete(string id) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } _bookService.Remove(book.Id); return NoContent(); } } } 前面的 Web API 控制器:使用 BookService 类执行 CRUD 操作。包含操作方法以支持 GET、POST、PUT 和 DELETE HTTP 请求。CreatedAtRoute 方法返回 201 响应,这是在服务器上创建新资源的 HTTP POST 方法的标准响应。 CreatedAtRoute 还会向响应添加位置标头。 位置标头指定新建的待办事项的 URI。 请参阅 10.2.2 201 已创建。
- 生成并运行应用。
- 在浏览器中导航到 http://localhost:<port>/api/books。 将显示下面的 JSON 响应:JSON复制[ { "id":"5bfd996f7b8e48dc15ff215d", "bookName":"Design Patterns", "price":54.93, "category":"Computers", "author":"Ralph Johnson" }, { "id":"5bfd996f7b8e48dc15ff215e", "bookName":"Clean Code", "price":43.15, "category":"Computers", "author":"Robert C. Martin" } ]