五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能

6 篇文章 0 订阅
6 篇文章 0 订阅

五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能
1.注册MongoDB账号,并获取Connection String;
MongoDB官网:MongoDB: The Developer Data Platform | MongoDB
获取Connection String教程:Connection String 获取

MongoDB ConnectionString

  1. 在VSCode for Mac按下shift+command+p搜索 Nuget Package Manager: Add Package,给项目添加包

    在这里插入图片描述

  2. 搜索包:MongoDB.Driver,Microsoft.EntityFrameworkCore,MongoDB.EntityFrameworkCore

    在这里插入图片描述

  3. MongoDB.Driver选择最新版本即可,如最新版本不适配您当前的.Net版本,请尝试根据MongoDB官网有关MongoDB.Driver的兼容性来进行安装:兼容性 - C#/.NET v2.28 (mongodb.com)

    Microsoft.EntityFrameworkCore和MongoDB.EntityFrameworkCore包选择8.x版本。
    在这里插入图片描述

  4. 在Web Api的appsetting.Development.json 添加MongoDB信息,在ConnectionString的值中填入在MongoDB官网获取的ConnectionString;

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "TeachingAppDatabase": {
        "BooksCollectionName": "books",
        "ConnectionString": "Fill it with your MongoDB connection string",
        "DatabaseName": "teaching_blazor_app"
      }
    }
    
    
  5. 创建Config/MongoDbConfiguration.cs,对应appsettings.Development.json中的参数。

    using System;
    namespace TeachingWebApi.Config
    {
    	public class TeachingAppDatabaseSettings
    	{
    		public string BooksCollectionName { get; init; }
    		public string ConnectionString { get; init; }
    		public string DatabaseName { get; init; }
    	}
    }
    
  6. 在Program.cs中加入以下服务,通过IConfiguration读取appsettings.Development.json中的参数。

    builder.Services.Configure<TeachingAppDatabaseSettings>(
    	builder.Configuration.GetSection("TeachingAppDatabase"));
    
  7. 创建BookService.cs添加 CRUD 操作服务.

    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    using TeachingWebApi.Config;
    using TeachingWebApi.Models;
    
    namespace TeachingWebApi.Services;
    
    public class BooksService
    {
        private readonly IMongoCollection<Book> _booksCollection;
    
        public BooksService(
            IOptions<TeachingAppDatabaseSettings> mongoDatabaseSettings)
        {
            var mongoClient = new MongoClient(
                mongoDatabaseSettings.Value.ConnectionString);
    
            var mongoDatabase = mongoClient.GetDatabase(
                mongoDatabaseSettings.Value.DatabaseName);
    
            _booksCollection = mongoDatabase.GetCollection<Book>(
                mongoDatabaseSettings.Value.BooksCollectionName);
        }
    
        public async Task<List<Book>> GetAsync() =>
            await _booksCollection.Find(_ => true).ToListAsync();
    
        public async Task<Book?> GetAsync(string id) =>
            await _booksCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
    
        public async Task CreateAsync(Book newBook) =>
            await _booksCollection.InsertOneAsync(newBook);
    
        public async Task UpdateAsync(string id, Book updatedBook) =>
            await _booksCollection.ReplaceOneAsync(x => x.Id == id, updatedBook);
    
        public async Task RemoveAsync(string id) =>
            await _booksCollection.DeleteOneAsync(x => x.Id == id);
    }
    
  8. 新建一个BookController.cs,实现CRUD;

    using Microsoft.AspNetCore.Mvc;
    using TeachingWebApi.Models;
    using TeachingWebApi.Services;
    
    namespace BookStoreApi.Controllers;
    
    [ApiController]
    [Route("api/[controller]")]
    public class BooksController : ControllerBase
    {
        private readonly BooksService _booksService;
    
        public BooksController(BooksService booksService) =>
            _booksService = booksService;
    
        [HttpGet]
        public async Task<List<Book>> Get() =>
            await _booksService.GetAsync();
    
        [HttpGet("{id:length(24)}")]
        public async Task<ActionResult<Book>> Get(string id)
        {
            var book = await _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            return book;
        }
    
        [HttpPost]
        public async Task<IActionResult> Post(Book newBook)
        {
            await _booksService.CreateAsync(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 _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            updatedBook.Id = book.Id;
    
            await _booksService.UpdateAsync(id, updatedBook);
    
            return NoContent();
        }
    
        [HttpDelete("{id:length(24)}")]
        public async Task<IActionResult> Delete(string id)
        {
            var book = await _booksService.GetAsync(id);
    
            if (book is null)
            {
                return NotFound();
            }
    
            await _booksService.RemoveAsync(id);
    
            return NoContent();
        }
    }
    
  9. 添加代码到Program.cs,以向 DI 注册 BooksService 类,以支持消费类中的构造函数注入。 单一实例服务生存期是最合适的,因为 BooksService 直接依赖于 MongoClient。 根据官方 Mongo Client 重用准则,应使用单一实例服务生存期在 DI 中注册 MongoClient

    builder.Services.AddSingleton<BooksService>();
    
  10. 新建类MongoDBContext.cs,负责连接MongoDB的上下文类;

    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Options;
    using MongoDB.Driver;
    using TeachingWebApi.Config;
    using TeachingWebApi.Models;
    
    namespace TeachingWebApi.Utils.Data
    {
        public class MongoDbContext : DbContext
        {
            public readonly IMongoDatabase _db;
            private readonly string _booksCollectionName;
            private readonly IOptions<TeachingAppDatabaseSettings> _setting;
    
            public MongoDbContext(IOptions<TeachingAppDatabaseSettings> setting)
            {
                _setting = setting;
                var client = new MongoClient(_setting.Value.ConnectionString);
                _db = client.GetDatabase(_setting.Value.DatabaseName);
                _booksCollectionName = _setting.Value.BooksCollectionName;
            }
    
            public IMongoCollection<Book> Books =>
            _db.GetCollection<Book>(_booksCollectionName);
    
        }
    }
    
  11. 添加类DatabaseSeeder.cs,负责初始化数据库;

    using Microsoft.Extensions.Localization;
    using Microsoft.AspNetCore.Identity;
    using MongoDB.Driver;
    using TeachingWebApi.Utils.Data;
    
    namespace CoolWebApi.Data.Seeder
    {
        public class DatabaseSeeder
        {
            private readonly MongoDbContext _dbContext;
    
            public DatabaseSeeder(
                MongoDbContext dbContext)
            {
                _dbContext = dbContext;
            }
    
            public void Initialize()
            {
                InitializeCollection();
            }
    
            public async void InitializeCollection()
            {
                await CreateCollection("books");
            }
    
            private async Task CreateCollection(string collectionName)
            {
                if (!CollectionExists(_dbContext._db, collectionName))
                {
                    await _dbContext._db.CreateCollectionAsync(collectionName, new CreateCollectionOptions
                    {
                        Capped = false
                    });
                    Console.WriteLine("Collection created!");
                }
            }
    
            private bool CollectionExists(IMongoDatabase database, string collectionName)
            {
                return database.ListCollectionNames().ToList().Contains(collectionName);
            }
        }
    }
    
  12. 在Program.cs添加数据库支持,使用Microsoft.EntityFrameworkCore和MongoDB.EntityFrameworkCore包,当项目运行时会执行DatabaseSeeder.cs和MongoDbContext.cs这两个类,实现初始化项目时生成数据库表;

    builder.Services
        .AddTransient<DatabaseSeeder>()
            .AddDbContext<MongoDbContext>(options => options
                .UseMongoDB(new MongoClient(MongoDbConectionString), "teaching_blazor_app"));
    
  13. 运行应用,记得将ConnectionString里的改成自己的密码,不然会报认证失败的错误;

    在这里插入图片描述

  14. 可以看到MongoDB的Collections已经自动生成了Books表,使用Swagger进行测试;
    在这里插入图片描述
    在这里插入图片描述

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答您的问题!您想了解的是关于使用.NET Core WebAPI开发网上书店的相关内容吗? 使用.NET Core WebAPI可以很方便地构建一个基于HTTP协议的API,用于处理网上书店的业务逻辑。下面是一些可能有用的步骤和建议: 1. 创建项目:首先,您可以使用Visual Studio或者命令行工具来创建一个新的.NET Core WebAPI项目。 2. 定义模型:根据您的需求,确定需要的数据模型,例如书籍、订单、用户等。使用C#定义这些模型,并在数据库中创建相应的表格。 3. 配置数据库:使用Entity Framework Core或者其他ORM工具来连接数据库,并配置数据库连接字符串。您可以选择使用关系型数据库,如SQL Server、MySQL,或者非关系型数据库,如MongoDB。 4. 实现控制器:创建控制器类来处理API请求,并实现相应的动作方法。例如,添加书籍、获取书籍列表、下订单等。在方法中,您可以使用依赖注入来获取服务实例,如书籍管理、订单处理等。 5. 安全认证和授权:根据需求,您可以添加身份验证和授权机制来保护API资源。例如,使用JWT(Json Web Token)来对用户进行认证,使用角色或策略来限制访问权限。 6. 编写API文档:为了方便其他开发者使用您的API,您可以使用Swagger等工具来生成和展示API文档。文档中包含API的接口定义、请求/响应示例等信息。 7. 部署和测试:最后,您可以将API部署到云服务器或者其他托管平台上,并进行测试。您可以使用Postman或其他API测试工具来发送请求,并验证API功能和性能。 当然,以上只是一个简单的指南,具体的实现细节还需要根据您的需求和项目的特点来进行调整和扩展。希望对您有所帮助!如果您有更多的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值