用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

 

數據庫生成成功:

 

 

今天先寫到這, 過幾天會繼續寫. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM