小编给大家分享一下.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应用中如何引入数据存储