iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >.NET 6开发TodoList应用中如何引入数据存储
  • 354
分享到

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

2023-06-22 05:06:53 354人浏览 八月长安
摘要

小编给大家分享一下.net 6开发TodoList应用中如何引入数据存储,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一.需求作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件。对我们的

小编给大家分享一下.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)    {    }}

    这里的处理方式可能会引起困惑,这个IApplicationDbContext存在的意义是什么。这里的疑问和关于要不要使用Repository模式有关,国外多位大佬讨论过这个问题,即Repository是不是必须的。可以简单理解大家达成的共识是:不是必须的,如果不是有某些特别的数据库访问逻辑,或者有足够的理由需要使用Repository模式,那就保持架构上的简洁,在Application层的多个CQRS Handlers中直接注入该IApplicationDbContext去访问数据库并进行操作。如果需要使用Repository模式,那在这里就没有必要定义这个接口来使用了,Application中只需要定义IRepository<T>,在Infrastructure中实现的BaseRepository中访问DbContext即可。

    我们后面是需要使用Repository的,是因为希望演示最常用的开发模式,但是在这一篇中我保留IApplicationDbConetxt的原因是也希望展示一种不同的实现风格,后面我们还是会专注到Repository上的。

    需要的对象添加好了,下一步是配置DbContext,我们还是遵循当前的架构风格,在Infrastructure项目中添加DependencyInjection.cs文件用于添加所有第三方的依赖:

    using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using TodoList.Application.Common.Interfaces;using TodoList.Infrastructure.Persistence;namespace TodoList.Infrastructure;public static class DependencyInjection{    public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)    {        services.ADDDbContext<TodoListDbContext>(options =>            options.UseSqlServer(                configuration.GetConnectionString("SqlServerConnection"),                b => b.MigrationsAssembly(typeof(TodoListDbContext).Assembly.FullName)));        services.AddScoped<IApplicationDbContext>(provider => provider.GetRequiredService<TodoListDbContext>());        return services;    }}

    3. 配置文件修改

    我们对appsettings.Development.json文件进行配置:

    {  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.Aspnetcore": "Warning"    }  },  "UseFileToLog": true,  "ConnectionStrings": {    "SqlServerConnection": "Server=localhost,1433;Database=TodoListDb;User Id=sa;PassWord=StrongPwd123;"  }}

    这里需要说明的是如果是使用MSSQL Server默认端口1433的话,连接字符串里是可以不写的,但是为了展示如果使用的不是默认端口应该如何配置,还是显式写在这里了供大家参考。

    4. 主程序配置

    api项目中,我们只需要调用上面写好的扩展方法,就可以完成配置。

    var builder = WEBApplication.CreateBuilder(args);// Add services to the container.builder.ConfigureLog();builder.Services.AddControllers();builder.Services.AddEndpointsApiExplorer();builder.Services.AddswaggerGen();// 添加基础设施配置builder.Services.AddInfrastructure(builder.Configuration);// 省略以下...

    5. 本地运行MSSQL Server容器及数据持久化

    在保证本地Docker环境正常启动之后,运行以下命令:

    # 拉取mssql镜像$ docker pull mcr.microsoft.com/mssql/server:2019-latest2019-latest: Pulling from mssql/server7b1a6ab2e44d: Already exists 4ffe416cf537: Pull complete fff1d174f64f: Pull complete 3588fd79aff7: Pull complete c8203457909f: Pull complete Digest: sha256:a098c9ff6fbb8e1c9608ad7511fa42dba8d22e0d50b48302761717840ccc26afStatus: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-latestmcr.microsoft.com/mssql/server:2019-latest# 创建持久化存储$ docker create -v /var/opt/mssql --name mssqldata  mcr.microsoft.com/mssql/server:2019-latest /bin/true3c144419db7fba26398aa45f77891b00a3253c23e9a1d03e193a3cf523c66ce1# 运行mssql容器,挂载持久化存储卷$ docker run -d --volumes-from mssqldata --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=StrongPwd123' -p 1433:1433 mcr.microsoft.com/mssql/server:2019-latestd99d774f70229f688d71fd13e90165f15abc492aacec48de287d348e047a055e# 确认容器运行状态$ docker psCONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS          PORTS                    NAMESd99d774f7022   mcr.microsoft.com/mssql/server:2019-latest   "/opt/mssql/bin/perm…"   24 seconds aGo   Up 22 seconds   0.0.0.0:1433->1433/tcp   mssql

    五.验证

    为了验证我们是否可以顺利连接到数据库,我们采用添加Migration并在程序启动时自动进行数据库的Migration方式进行:

    首先安装工具:

    dotnet tool install --global dotnet-ef# dotnet tool update --global dotnet-ef# 生成Migration$ dotnet ef migrations add SetupDb -p src/TodoList.Infrastructure/TodoList.Infrastructure.csproj -s src/TodoList.Api/TodoList.Api.csprojBuild started...Build succeeded.[17:29:15 INF] Entity Framework Core 6.0.1 initialized 'TodoListDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.1' with options: MigrationsAssembly=TodoList.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Done. To undo this action, use 'ef migrations remove'

    为了在程序启动时进行自动Migration,我们向Infrastructure项目中增加一个文件ApplicationStartupExtensions.cs并实现扩展方法:

    using Microsoft.AspNetCore.Builder;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.DependencyInjection;using TodoList.Infrastructure.Persistence;namespace TodoList.Infrastructure;public static class ApplicationStartupExtensions{    public static void MigrateDatabase(this WebApplication app)    {        using var scope = app.Services.CreateScope();        var services = scope.ServiceProvider;        try        {            var context = services.GetRequiredService<TodoListDbContext>();            context.Database.Migrate();        }        catch (Exception ex)        {            throw new Exception($"An error occurred migrating the DB: {ex.Message}");        }    }}

    并在Api项目的Program.cs中调用扩展方法:

    // 省略以上...app.MapControllers();// 调用扩展方法app.MigrateDatabase();app.Run();

    最后运行主程序:

    $ dotnet run --project src/TodoList.ApiBuilding...[17:32:32 INF] Entity Framework Core 6.0.1 initialized 'TodoListDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.1' with options: MigrationsAssembly=TodoList.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null [17:32:32 INF] Executed DbCommand (22ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT 1[17:32:32 INF] Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT OBJECT_ID(N'[__EFMigrationsHistory]');[17:32:32 INF] Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT 1[17:32:32 INF] Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT OBJECT_ID(N'[__EFMigrationsHistory]');[17:32:33 INF] Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT [MigrationId], [ProductVersion]FROM [__EFMigrationsHistory]ORDER BY [MigrationId];[17:32:33 INF] Applying migration '20211220092915_SetupDb'.[17:32:33 INF] Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])VALUES (N'20211220092915_SetupDb', N'6.0.1');[17:32:33 INF] Now listening on: https://localhost:7039[17:32:33 INF] Now listening on: Http://localhost:5050[17:32:33 INF] Application started. Press Ctrl+C to shut down.[17:32:33 INF] Hosting environment: Development[17:32:33 INF] Content root path: /Users/yu.li1/Projects/asinta/blogs/cnblogs/TodoList/src/TodoList.Api/

    使用数据库工具连接容器数据库,可以看到Migration已经成功地写入数据库表__EFMigrationsHistory了:

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

    看完了这篇文章,相信你对“.NET 6开发TodoList应用中如何引入数据存储”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: .NET 6开发TodoList应用中如何引入数据存储

    本文链接: https://www.lsjlt.com/news/302865.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • .NET 6开发TodoList应用中如何引入数据存储
      小编给大家分享一下.NET 6开发TodoList应用中如何引入数据存储,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一.需求作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件。对我们的...
      99+
      2023-06-22
    • 怎么使用.NET 6开发TodoList应用引入数据存储
      本篇内容主要讲解“怎么使用.NET 6开发TodoList应用引入数据存储”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用.NET 6开发TodoList应用引入数据存...
      99+
      2023-06-22
    • 使用.NET 6开发TodoList应用之引入数据存储的思路详解
      目录需求目标原理和思路实现1. 引入Nuget包并进行配置2. 添加DBContext对象并进行配置3. 配置文件修改4. 主程序配置5. 本地运行MSSQL Server容器及数据...
      99+
      2024-04-02
    • .NET6开发TodoList应用引入数据存储
      目录一.需求二.目标三.原理和思路四.实现1. 引入Nuget包并进行配置2. 添加DBContext对象并进行配置#3. 配置文件修改4. 主程序配置5. 本地运行MSSQL Se...
      99+
      2024-04-02
    • .NET 6开发TodoList应用中如何引入第三方日志库
      这篇文章将为大家详细讲解有关.NET 6开发TodoList应用中如何引入第三方日志库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.需求在我们项目开发的过程中,使用.NET 6自带的日志系统...
      99+
      2023-06-22
    • .NET 6开发TodoList应用引入第三方日志库
      目录1.需求2.目标3.原理和思路4.实现4.1日志配置实现4.2主程序配置4.3注入使用5.验证1.需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际...
      99+
      2024-04-02
    • .NET 6开发TodoList应用怎么实现数据塑形
      这篇文章主要介绍“.NET 6开发TodoList应用怎么实现数据塑形”,在日常操作中,相信很多人在.NET 6开发TodoList应用怎么实现数据塑形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
      99+
      2023-06-22
    • .NET 6开发TodoList应用之如何实现PUT请求
      这篇文章将为大家详细讲解有关.NET 6开发TodoList应用之如何实现PUT请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求PUT请求本身其实可说的并不多,过程也和创建基本类似。在这篇...
      99+
      2023-06-22
    • .NET 6开发TodoList应用中如何实现全局异常处理
      本篇文章为大家展示了.NET 6开发TodoList应用中如何实现全局异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需求因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么...
      99+
      2023-06-22
    • .NET 6开发TodoList应用中如何实现DELETE请求与HTTP请求幂等性
      本篇文章为大家展示了.NET 6开发TodoList应用中如何实现DELETE请求与HTTP请求幂等性,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需求先说明一下关于原本想要去更新的PAT...
      99+
      2023-06-22
    • Java开发中的大数据存储挑战:IDE如何帮助您应对?
      随着数据规模不断增大,大数据存储已成为现代软件开发中的一大挑战。Java作为一种常用的编程语言,已经在大数据存储领域占据了一席之地。本文将介绍Java开发中的大数据存储挑战,并探讨如何利用IDE来应对这些挑战。 一、Java开发中的大数据...
      99+
      2023-09-05
      大数据 存储 ide
    • Vue3中如何引入Pinia存储库并使用
      今天小编给大家分享一下Vue3中如何引入Pinia存储库并使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。用自己最喜欢的方...
      99+
      2023-07-06
    • 如何在Android开发中利用数据持久化存储文件
      这期内容当中小编将会给大家带来有关如何在Android开发中利用数据持久化存储文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据持久化数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关...
      99+
      2023-05-31
      android 数据持久化 roi
    • PHP开发中如何使用Memcache进行高效的数据缓存和存储?
      随着互联网技术的发展,数据量的增加和用户需求的提升,如何提高系统性能成为一个亟待解决的问题。数据缓存是提高系统性能的重要手段之一,而Memcache则是PHP开发中非常常用的缓存工具。在本篇文章中,我们将介绍如何使用Memcache进行高效...
      99+
      2023-11-07
      缓存 PHP Memcache
    • 如何优化PHP开发中的数据库存储和查询
      摘要:在PHP开发中,数据库是一个至关重要的组成部分。合理地存储和查询数据库是提高性能和效率的重要手段。本文将介绍一些常用的优化技巧,并提供具体的代码示例,帮助开发者在PHP项目中优化数据库的存储和查询。引言:在现代的Web开发中,数据库扮...
      99+
      2023-10-21
      优化 数据库 PHP
    • 如何在Java开发中最大限度地利用大数据存储?
      大数据存储是当今互联网时代的重要组成部分,而Java作为一种广泛应用的编程语言,在大数据存储方面也有着广泛的应用。本文将介绍如何在Java开发中最大限度地利用大数据存储。 一、什么是大数据存储 大数据存储指的是存储大数据量的技术和方法,包括...
      99+
      2023-09-05
      大数据 存储 ide
    • PHP开发中如何优化数据存储和访问性能
      在PHP开发过程中,数据存储和访问性能的优化是非常重要的。良好的优化可以提高系统的响应速度,降低资源消耗,提高用户体验。本文将介绍一些常见的优化技巧,并提供具体的代码示例。合理选择数据库引擎在选择数据库引擎时,需要根据具体的业务需求和场景来...
      99+
      2023-10-21
      索引优化 数据库优化 数据缓存
    • PHP开发中如何处理大量数据存储和查询
      在实际的PHP开发中,处理大量数据存储和查询是一个常见的需求。无论是社交媒体网站还是电子商务平台,都会面临存储和查询大量数据的挑战。本文将介绍几种应对大量数据存储和查询的常用方法,并给出具体的代码示例。一、数据库设计和索引优化在处理大量数据...
      99+
      2023-10-21
      数据存储 - 数据库优化 数据查询 - 高效索引 大数据处理 - 分布式计算
    • 如何解决PHP开发中的数据安全和加密存储
      随着互联网的普及和应用程序的发展,数据安全和加密存储变得越来越重要。在PHP开发中,我们需要采取一些措施来确保敏感数据的安全性,以防止潜在的攻击和数据泄露。本文将介绍一些常用的方法和实例,帮助您在PHP开发中解决数据安全和加密存储的问题。使...
      99+
      2023-10-21
      数据安全 PHP开发 加密存储
    • PHP开发中如何使用Memcache实现高效的数据缓存和存储操作?
      Memcache 是一种基于内存的缓存系统,它可以用于缓存诸如数据库查询结果、API 响应等常见的需要频繁读取的数据。在 PHP 开发中,使用 Memcache 可以极大地提高应用程序的性能,本文将介绍在 PHP 开发中如何使用 Memca...
      99+
      2023-11-07
      Memcache PHP开发 数据缓存
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作