最近使用 vscode 比较多. 学习了一下如何在 mac 上使用 vscode 开发 asp.netcore 项目.
这里是我写的关于 vscode 的一篇文章:
- https://www.cnblogs.com/cgzl/p/8450179.html
- http://www.cnblogs.com/cgzl/p/8450409.html
这篇文章写的是使用 mac(linux)/win10 开发一个基于 asp.net core 2.0 web api, angular 5, bootstrap 4, sql server linux(使用到 docker)的小项目.
该文章大约分这几部分:
开发环境的搭建
建立和配置 asp.net core 2.0 web api
建立和配置 angular5 项目
开发基本的 CRUD 功能
基于 Unit Of Work 和 Repository 等 Pattern 对项目重构
其他业务功能的实现, 例如文件上传等
授权和验证
该文章涉及到以下技术:
- asp.net core, angular 5, vscode, docker, sql server on linux, bootstrap 4.
- ------------------------------------------------------------------------------------------------
项目需求:
开发一个电视剧管理程序, 数据表有:
TvNetworks(电视台), TvShows(电视剧), TvShowSeasons(电视剧分季), Tags(分类标签), TvShowTags(电视剧到分类标签).
就是对电视台, 电视剧等信息进行 CRUD 维护的程序.
------------------------------------------------------------------------------------------------
开发环境配置
1. 安装. net core sdk:
到官网下载并安装相应平台的. net core sdk: https://dotnet.github.io
安装好之后, 打开命令行: 执行 dotnet --version, 可以看到版本号, 这就说明安装成功了.
2. 安装 visual studio code:
官网: https://code.visualstudio.com/
安装好之后, 可以选择把 vscode 添加到 Path:
使用 command+option+p(mac)或者 ctrl+shift+p(win)打开命令板, 输入 path, 选择 install code command in path.
然后打开命令行 输入 code . 如果 vscode 能打开当前目录, 那么说明操作成功了.
我安装了如下扩展:
当然 python 扩展可以不用安装...
3. Sql Server:
貌似目前没有 mac 版本到 sql server. 所以采用 docker.
首先安装 docker: https://www.docker.com/docker-mac 这个是 mac 版本到下载地址, 下载后按照说明安装即可.
对于 windows 10 版到, 首先要确保您到 windows 10 要高于 Home 版. 因为 docker win 10 版依赖于 hyper-v, 而 win10 home 版没有 hyper-v.
安装好之后, 需要调整以下 docker 的设置, 至少需要 4G 内存(sql server 需要):
docker 的简介可以参考我写的这片入门级文章: http://www.cnblogs.com/cgzl/p/8458926.html
然后下载 sqlserver linux 版的 image (https://hub.docker.com/r/microsoft/mssql-server-linux/), 命令行输入:
docker pull microsoft/mssql-server-linux
这个操作在国内可能会很慢, 请耐心...
下载好之后, 查看本地的 images, 使用命令:
docker images
接下来安装并运行这个 image:
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD = 一个复杂的密码' -p 1433:1433 -d microsoft/mssql-server-linux
成功后, 使用 docker ps 命令可以查看正在运行的进程:
使用 docker ps -a 可以查看所有的进程, 包括已经停止的.
然后我们使用 vscode 测试以下这个 sqlserver, 在 vscode 里面添加一个 xx.sql 文件, 待 vscode 自动安装好相应的插件后, 使用 cmd+opt+p 打开命令板, 输入 mssql, 选择 mssql: connect:
如果以前没有连接过的话, 就选择 Create Connection Profile:
然后输入 server 的名字 localhost:
]
接下来输入数据库名, 因为还没有建立任何数据库, 所以就输入 master 吧:
选择登陆类型 SQL Login(如果是 win10 的话, 也可以选择 integrated):
用户名 sa:
密码:
然后选择是否保存密码, 最后给这个连接起一个名字:
这些操作完成后, 就会尝试连接 master 数据库, 连接成功的话上面会有提示框, 右下角也可以看出来:
写一个 sql 语句测试以下:
SELECT * FROM dbo.sysdatabases;
点击右键 (cmd+shift+e) 执行 sql:
ok, 数据库安装成功.
如果 docker 重启后, 可以使用 docker start (容器 ID 的前两位)命令启动这个 sql 容器.
4. 安装 angular cli:
首先安装 nodejs: https://nodejs.org/en/
然后执行命令安装 angular cli:
- npm install -g @angular-cli
- ------------------------------------------------------------------------------------------------
建立 asp.net core 项目
命令行执行命令, 建立文件夹和 webapi 项目:
mkdir Tv && cd Tv && dotnet new webapi
然后执行 dotnet run:
浏览器访问 http://localhost:5000/api/values:
项目建立成功了.
然后在命令行输入 code . 就可以用 vscode 打开该目录了:
关于 asp.net core 2.0 的简介可以参考我的文章: http://www.cnblogs.com/cgzl/p/7637250.html
环境变量:
运行 dotnet run 的时候, 可以看到这句话:
这表示当前的宿主环境变量为 Production, 而我们可能需要用到 Development 或者 Staging.
有几种办法可以更改这个环境变量的值:
1. 在执行 dotnet run 之前设置环境变量:
- mac: export ASPNETCORE_ENVIRONMENT=Development
- windows: set ASPNETCORE_ENVIRONMENT="Development"
2. windows 下可以在控制面板 -- 系统 -- 高级设置里面设置环境变量的值
3. mac 下, 进入用户的 home 目录, 然后执行
code .bash_profile
在该文件后面加上:
export ASPNETCORE_ENVIRONMENT=Development
这样也可以.
4. 在项目的 appSettings.json 文件里面设置也可以:
使用 visual studio 2017 的话, 可以在项目的 launchSettings.json 设置.
使用 vscode 的话, 可以在项目目录的 launch.json 进行设置.
不过这就需要使用 vscode 来启动项目了.
安装. net watch tool
经常开发前端的都知道, 前端项目开发的时候一般都采用 hot module replacement 技术, 就是文件有变化的时候, 自动重新编译并刷新浏览器.
默认情况下 dotnet run 没有这个功能, 所以需要添加 dotnet watch tool 来实现类似的功能: https://github.com/aspnet/DotNetTools/blob/dev/src/dotnet-watch/README.md
打开 Tv.csproj 添加此行:
- <ItemGroup>
- <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
- <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
- </ItemGroup>
然后执行命令:
dotnet restore
这样就使用下面的命令来代替 dotnet run:
dotnet watch run
您可以随便修改一点代码, 然后就可以看到项目被重新编译并运行了.
Debugging asp.net core
参考我这篇文章: http://www.cnblogs.com/cgzl/p/8450179.html
切换到 Debug 画面, 然后注意选择到是. net core attach, 因为我们之前运行着 dotnet watch run, 所以只能附加着去调试.
点击绿色到调试箭头, 或者按 F5, 需要选择相应到命令:
由于 dotnet watch run 随时会 build 出新到 Tv.dll, 所以 attach 到 dotnet Tv.dll 即可. (dotnet watch run 和 dotnet exec 是两个不同到进程).
集成 Git
在项目目录执行 git init 之后, 左边到 Git 菜单就会起作用了:
常用都 git 命令都有对应的菜单. 不过这篇文章里, 其实并没有使用到 git.
-----------------------------------------------------------------------------------------------------
配置 asp.net core 2.0 web api
这一部分, 主要做以下几方面工作:
建立 api
配置和使用 entity framework core 2.0
配置 asp.net core
使用 automapper
建立 domain models:
这里有一些快捷操作, 如果是新手的话可能不知道, 那么这一段我使用视频.
视频好像发布不出来, 请看连接:
- http://v.qq.com/x/page/u0560t3iwef.html
- http://v.qq.com/x/page/w05600dxo8j.html
这两个 model 的代码如下, Models/TvNetwork.cs:
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- namespace Tv.Models
- {
- public class TvNetwork
- {
- public TvNetwork()
- {
- TvShows = new Collection<TvShow>();
- }
- public int Id { get; set; }
- public string Name { get; set; }
- public ICollection<TvShow> TvShows { get; set; }
- }
- }
注意建立属性的快捷键是 prop, 建立构造函数的快捷键是 ctor.
为了避免使用 TvShows 属性时出现 NullReference Exception, 所以建议在构造函数里面初始化集合导航属性.
- Models/TvShow.cs:
- namespace Tv.Models
- {
- public class TvShow
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public int TvNetworkId { get; set; }
- public TvNetwork TvNetwork { get; set; }
- }
- }
添加 Entity Framework Core
这里需要使用到 dotnet ef 命令, 在项目目录下执行命令:
dotnet ef
没有找到这个命令, 这是因为还没有添加 ef 到 tools 到项目.
参考官方文档: https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
执行命令:
- dotnet add package Microsoft.EntityFrameworkCore.Design
- dotnet restore
然后打开 Tv.csproj 添加一个引用:
- <ItemGroup>
- <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
- <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
- <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
- </ItemGroup>
再执行 dotnet restore 即可. 这时再执行 dotnet ef 命令, 就可以使用了:
创建 DbContext
创建一个文件夹叫做 Database, 然后在里面建立一个文件 TvContext.cs:
- using Microsoft.EntityFrameworkCore;
- namespace Tv.Database
- {
- public class TvContext : DbContext
- {
- public TvContext(DbContextOptions<TvContext> options)
- : base(options)
- {
- }
- }
- }
根据官方文档, 就是这样建立 dbcontext 的.
使用 dbcontext 的时候, 是需要依赖注入的. 所以需要在 Startup.cs 的 ConfigureServices 把 TvContext 注册到容器:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddDbContext<TvContext>(opt => opt.UseSqlServer(""));
- services.AddMvc();
- }
- http://v.qq.com/x/page/f056037xm2q.html
通常我们是在 appSettings.json 里面添加数据库连接字符串:
- {
- "ConnectionStrings": {
- "Default": "server=localhost; database=tvdb; user id=sa; password=Bx@steel1;"
- },
- "Logging": {
- "IncludeScopes": false,
- "Debug": {
- "LogLevel": {
- "Default": "Warning"
- }
- },
- "Console": {
- "LogLevel": {
- "Default": "Warning"
- }
- }
- }
- }
回到 Startup.cs, 可以使用这两种方式取得连接字符串:
- public void ConfigureServices(IServiceCollection services)
- {
- // services.AddDbContext<TvContext>(opt => opt.UseSqlServer(Configuration["ConnectionStrings:Default"]));
- services.AddDbContext<TvContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("Default")));
- services.AddMvc();
- }
下面, 就可以创建数据库了.
创建数据库
首先添加 migrations:
dotnet ef migrations add Initial
执行成功后, 会在项目里生成一个 Migrations 文件夹:
可以看到 Initial Migration 文件里面什么也没有, 因为我忘记把 Domain Model 添加到 TvContext 里面了.
所以使用命令:
dotnet ef migrations remove
来移除上一次添加并且还未更新到数据库的 migration, 注意这时候需要停止 dotnet watch 等操作, 还要注意的是, 在 ef core 里千万不要手动删除迁移文件, 因为这里多出了一个 Snapshot 文件, 它和所有的迁移是同步的.
相应的迁移文件也被删除了.
修改 TvContext:
- using Microsoft.EntityFrameworkCore;
- using Tv.Models;
- namespace Tv.Database {
- public class TvContext: DbContext {
- public TvContext(DbContextOptions < TvContext > options) : base(options) {}
- public DbSet < TvNetwork > TvNetworks {
- get;
- set;
- }
- public DbSet < TvShow > TvShows {
- get;
- set;
- }
- }
- }
然后重新执行 dotnet ef migrations add Initial:
最后执行生成数据库的命令:
dotnet ef database update
数据库生成成功:
今天先写到这, 过几天会继续写.
来源: https://www.cnblogs.com/cgzl/p/8478993.html