最近使用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
資料庫生成成功:
今天先寫到這, 過幾天會繼續寫.