使用 ASP.NET Core 和 MongoDB 創(chuàng)建 Web API

2019-04-17 08:57 更新

本教程創(chuàng)建對(duì) MongoDB NoSQL 數(shù)據(jù)庫(kù)執(zhí)行創(chuàng)建、讀取、更新和刪除 (CRUD) 操作的 Web API。

在本教程中,你將了解:

  • 配置 MongoDB
  • 創(chuàng)建 MongoDB 數(shù)據(jù)庫(kù)
  • 定義 MongoDB 集合和架構(gòu)
  • 從 Web API 執(zhí)行 MongoDB CRUD 操作

查看或下載示例代碼如何下載

系統(tǒng)必備

配置 MongoDB

如果使用的是 Windows,MongoDB 將默認(rèn)安裝在 C:\Program Files\MongoDB 中。 將 C:\Program Files\MongoDB\Server\<version_number>\bin 添加到 Path 環(huán)境變量中。 通過(guò)此更改可以從開發(fā)計(jì)算機(jī)上的任意位置訪問(wèn) MongoDB。

使用以下步驟中的 mongo Shell 可以創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建集合和存儲(chǔ)文檔。 有關(guān) mongo Shell 命令的詳細(xì)信息,請(qǐng)參閱使用 mongo Shell。

  1. 選擇開發(fā)計(jì)算機(jī)上用于存儲(chǔ)數(shù)據(jù)的目錄。 例如,Windows 上的 C:\BooksData。 創(chuàng)建目錄(如果不存在)。 mongo Shell 不會(huì)創(chuàng)建新目錄。
  2. 打開命令行界面。 運(yùn)行以下命令以連接到默認(rèn)端口 27017 上的 MongoDB。 請(qǐng)記得將 <data_directory_path> 替換為上一步中選擇的目錄。console復(fù)制mongod --dbpath <data_directory_path>
  3. 打開另一個(gè)命令行界面實(shí)例。 通過(guò)運(yùn)行以下命令來(lái)連接到默認(rèn)測(cè)試數(shù)據(jù)庫(kù):console復(fù)制mongo
  4. 在命令行界面中運(yùn)行下面的命令:console復(fù)制use BookstoreDb 如果該命令尚不存在,則將創(chuàng)建名為 BookstoreDb 的數(shù)據(jù)庫(kù)。 如果該數(shù)據(jù)庫(kù)存在,則將為事務(wù)打開其連接。
  5. 使用以下命令創(chuàng)建 Books 集合:console復(fù)制db.createCollection('Books') 顯示以下結(jié)果:console復(fù)制{ "ok" : 1 }
  6. 使用以下命令定義 Books 集合的架構(gòu)并插入兩個(gè)文檔:console復(fù)制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'}]) 顯示以下結(jié)果:console復(fù)制{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
  7. 使用以下命令查看數(shù)據(jù)庫(kù)中的文檔:console復(fù)制db.Books.find({}).pretty() 顯示以下結(jié)果:console復(fù)制{ "_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" } 該架構(gòu)將為每個(gè)文檔添加類型 ObjectId 的自動(dòng)生成的 _id 屬性。

數(shù)據(jù)庫(kù)可供使用了。 你可以開始創(chuàng)建 ASP.NET Core Web API。

創(chuàng)建 ASP.NET Core Web API 項(xiàng)目

  1. 轉(zhuǎn)到“文件” > “新建” > “項(xiàng)目”。

  2. 選擇“ASP.NET Core Web 應(yīng)用程序”,將項(xiàng)目命名為“BooksApi”,然后單擊“確定”。

  3. 選擇“.NET Core”目標(biāo)框架和“ASP.NET Core 2.2”。 選擇“API”項(xiàng)目模板,然后單擊“確定”:

  4. 訪問(wèn) NuGet 庫(kù):MongoDB.Driver 來(lái)確定適用于 MongoDB 的 .NET 驅(qū)動(dòng)程序的最新穩(wěn)定版本。 在“包管理器控制臺(tái)”窗口中,導(dǎo)航到項(xiàng)目根。 運(yùn)行以下命令以安裝適用于 MongoDB 的 .NET 驅(qū)動(dòng)程序:

    PowerShell
    Install-Package MongoDB.Driver -Version {VERSION}
    

添加模型

  1. 將 Models 目錄添加到項(xiàng)目根。
  2. 使用以下代碼將 Book 類添加到 Models 目錄:C#復(fù)制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屬性:

  • 需要在將公共語(yǔ)言運(yùn)行時(shí) (CLR) 對(duì)象映射到 MongoDB 集合時(shí)使用。
  • 使用 [BsonId] 進(jìn)行批注,以將此屬性指定為文檔的主鍵。
  • 使用 [BsonRepresentation(BsonType.ObjectId)] 進(jìn)行批注,以允許將參數(shù)作為類型 string而非 ObjectId 傳遞。 Mongo 處理從 string 到 ObjectId 的轉(zhuǎn)換。

類中的其他屬性使用 [BsonElement] 屬性進(jìn)行批注。 該屬性的值表示 MongoDB 集合中的屬性名稱。

添加 CRUD 操作類

  1. 將 Services 目錄添加到項(xiàng)目根。
  2. 使用以下代碼將 BookService 類添加到 Services 目錄:C#復(fù)制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); } } }
  3. 將 MongoDB 連接字符串添加到 appsettings.json:C#復(fù)制{ "ConnectionStrings": { "BookstoreDb": "mongodb://localhost:27017" }, "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Warning" } }, "Console": { "LogLevel": { "Default": "Warning" } } } } 將在 BookService 類構(gòu)造函數(shù)中訪問(wèn)前面的 BookstoreDb 屬性。
  4. 在 Startup.ConfigureServices 中,向依賴關(guān)系注入系統(tǒng)注冊(cè) BookService 類:C#復(fù)制public void ConfigureServices(IServiceCollection services) { services.AddScoped<BookService>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } 必須執(zhí)行前面的服務(wù)注冊(cè)才能支持消費(fèi)類中的構(gòu)造函數(shù)注入。

BookService 類使用以下 MongoDB.Driver 成員對(duì)數(shù)據(jù)庫(kù)執(zhí)行 CRUD 操作:

  • MongoClient – 讀取執(zhí)行數(shù)據(jù)庫(kù)操作的服務(wù)器實(shí)例。 此類的構(gòu)造函數(shù)提供了 MongoDB 連接字符串:C#復(fù)制public BookService(IConfiguration config) { var client = new MongoClient(config.GetConnectionString("BookstoreDb")); var database = client.GetDatabase("BookstoreDb"); _books = database.GetCollection<Book>("Books"); }
  • IMongoDatabase – 表示用于執(zhí)行操作的 Mongo 數(shù)據(jù)庫(kù)。 本教程在界面上使用泛型 GetCollection<T>(collection) 方法來(lái)獲取對(duì)特定集合中的數(shù)據(jù)的訪問(wèn)。 調(diào)用此方法后,可以對(duì)集合執(zhí)行 CRUD 操作。 在 GetCollection<T>(collection) 方法調(diào)用中:collection 表示集合名稱。T 表示存儲(chǔ)在集合中的 CLR 對(duì)象類型。

GetCollection<T>(collection) 返回 MongoCollection 對(duì)象,該對(duì)象表示集合。 在本教程中,對(duì)集合調(diào)用以下方法:

  • Find<T> – 返回集合中與提供的搜索條件匹配的所有文檔。
  • InsertOne – 插入提供的對(duì)象作為集合中的新文檔。
  • ReplaceOne – 將與提供的搜索條件匹配的單個(gè)文檔替換為提供的對(duì)象。
  • DeleteOne – 刪除與提供的搜索條件匹配的單個(gè)文檔。

添加控制器

  1. 使用以下代碼將 BooksController 類添加到 Controllers 目錄:C#復(fù)制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 類執(zhí)行 CRUD 操作。包含操作方法以支持 GET、POST、PUT 和 DELETE HTTP 請(qǐng)求。CreatedAtRoute 方法返回 201 響應(yīng),這是在服務(wù)器上創(chuàng)建新資源的 HTTP POST 方法的標(biāo)準(zhǔn)響應(yīng)。 CreatedAtRoute 還會(huì)向響應(yīng)添加位置標(biāo)頭。 位置標(biāo)頭指定新建的待辦事項(xiàng)的 URI。 請(qǐng)參閱 10.2.2 201 已創(chuàng)建
  2. 生成并運(yùn)行應(yīng)用。
  3. 在瀏覽器中導(dǎo)航到 http://localhost:<port>/api/books。 將顯示下面的 JSON 響應(yīng):JSON復(fù)制[ { "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" } ]


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)