.NET 6开发TodoList应用中如何引入数据存储

小编给大家分享一下.NET 6开发TodoList应用中如何引入数据存储,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    一.需求

    作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件。对我们的TodoList项目来说,自然也需要配置数据存储。

    目前的需求很简单:

    • 需要能持久化TodoList对象并对其进行操作;

    • 需要能持久化TodoItem对象并对其进行操作;

    问题是,我们打算如何存储数据?

    存储组件的选择非常多:以MSSQL Server/Postgres/MySql/SQLite等为代表的关系型数据库,以MongoDB/ElasticSearch等为代表的非关系型数据库,除此之外,我们还可以在开发阶段选择内存数据库,在云上部署的时候还可以选择类似Azure Cosmos DB/AWS DynamoDB以及云上提供的多种关系型数据库。

    应用程序使用数据库服务,一般都是借助成熟的第三方ORM框架,而在.NET后端服务开发的过程中,使用的最多的两个ORM框架应该是:EntityFrameworkCore和Dapper,相比之下,EFCore的使用率更高一些。所以我们也选择EFCore来进行演示。

    二.目标

    在这篇文章中,我们仅讨论如何实现数据存储基础设施的引入,具体的实体定义和操作后面专门来说。

    • 使用MSSQL Server容器作为数据存储组件(前提是电脑上需要安装Docker环境,下载并安装Docker Desktop即可);

    这样选择的理由也很简单,对于使用Mac的小伙伴来说,使用容器来启动MSSQL Server可以避免因为非Windows平台导致的示例无法运行的问题。

    三.原理和思路

    因为我们对开发环境和生产环境的配置有差异,那先来看看共性的部分:

    • 引入EFCore相关的nuget包并进行配置;

    • 添加DbContext对象并进行依赖注入;

    • 修改相关appsettings.{environment}.json文件;

    • 主程序配置。

    • 本地运行MSSQL Server容器并实现数据持久化;

    同上一篇一样,和具体的第三方对接的逻辑我们还是放到Infrastructure里面去,应用程序中只保留对外部服务的抽象操作。

    四.实现

    1. 引入Nuget包并进行配置

    需要在Infrastructure项目中引入以下Nuget包:

    Microsoft.EntityFrameworkCore.SqlServer
    
    # 第二个包是用于使用PowerShell命令(Add-Migration/Update-Database/...)需要的,如果使用eftool,可以不安装这个包。
    Microsoft.EntityFrameworkCore.Tools

    为了使用eftool,需要在Api项目中引入以下Nuget包:

    Microsoft.EntityFrameworkCore.Design

    2. 添加DBContext对象并进行配置#

    在这一步里,我们要添加的是一个具体的DBContext对象,这对于有经验的开发者来说并不是很难的任务。但是在具体实现之前,我们可以花一点时间考虑一下现在的Clean Architecture结构:我们的目的是希望除了Infrastructure知道具体交互的第三方是什么,在Application以及Domain里都要屏蔽底层的具体实现。换言之就是需要在Infrastrcuture之外的项目中使用接口来做具体实现的抽象,那么我们在Application中新建一个Common/Interfaces文件夹用于存放应用程序定义的抽象接口IApplicationDbContext:

    namespace TodoList.Application.Common.Interfaces;
    
    public interface IApplicationDbContext
    {
        Task<int> SaveChangesAsync(CancellationToken cancellationToken);
    }

    接下来在Infrastructure项目中新建Persistence文件夹用来存放和数据持久化相关的具体逻辑,我们在其中定义DbContext对象并实现刚才定义的接口。

    using Microsoft.EntityFrameworkCore;
    using TodoList.Application.Common.Interfaces;
    
    namespace TodoList.Infrastructure.Persistence;
    
    public class TodoListDbContext : DbContext, IApplicationDbContext
    {
        public TodoListDbContext(DbContextOptions<TodoListDbContext> options) : base(options)
        {
        }
    }

    .NET 6开发TodoList应用中如何引入数据存储