用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

最近使用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

 

数据库生成成功:

 

 

今天先写到这, 过几天会继续写. 

posted @ 2018-02-27 22:04  yangxu-pro  阅读(5076)  评论(11编辑  收藏  举报