本文章主要說明asp.net core的創建和簡單使用。 一、使用到的命令 dotnet new :創建項目(解決方案,類庫,單元測試等),如:dotnet new web dotnet add package 添加一個nuget的引用 dotnet test:運行測試 dotnet build:編 ...
本文章主要說明asp.net core的創建和簡單使用。
一、使用到的命令
- dotnet new :創建項目(解決方案,類庫,單元測試等),如:
dotnet new web
- dotnet add package 添加一個nuget的引用
- dotnet test:運行測試
- dotnet build:編譯項目
- dotnet sln add:將項目添加到解決方案
- dotnet add reference:對此項目添加項目引用
二、建立空項目
- 在測試目錄下運行
dotnet new web -n baseWeb
,創建web項目,結果如下圖所示: - 運行
dotnet run
,即可運行此項目,此命令內部會執行dotnet build
命令編譯項目,然後運行,結果如下:
說明:此命令是在sln(解決方案)文件所在目錄運行的,所以增加了-p參數,用於指定啟動指定的項目。
三、引入mvc
- 由於我們創建是一個空web項目,是沒有mvc相關依賴包的,所以首先需要運行
dotnet add package Microsoft.AspNet.Mvc
進行依賴包的安裝 - 然後在StartUp類的ConfigureServices方法中添加如下代碼:
public void ConfigureServices(IServiceCollection service){ service.AddMvc(); service.AddRouting(); }
上述添加此添加了Mvc,也添加了路由
- 配置路由,還是在StartUp類中,其方法為Configure添加如下代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } //添加的代碼 app.UseMvc(routers=>{ routers.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); }); app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); }
- 對controller和view的創建
在創建controller時,沒有找到完全好的 命令創建方法,所以使用的是手動創建文件,然後繼承Controller類實現;而view是可以通過dotnet new page
實現的,但也可以使用手動創建。文件結果如下: - 執行
dotnet run
運行,然後網頁訪問對就的地址即可
四、更換依賴註入為autofac
aspnet core是自帶了依賴註入功能的,就是StartUp類中ConfigureServices方法的IServiceCollection類型的形參。如果你想替換為autofac。請參考如下步驟
- 安裝autofac,以及acutofac的擴展類
- Autofac
- Autofac.Extensions.DependencyInjection
- 更改StartUp類中的configureSeervices方法
public IServiceProvider ConfigureServices(IServiceCollection service){ service.AddMvc(); service.AddRouting(); var containerBuilder = new ContainerBuilder(); containerBuilder.Populate(service); containerBuilder.RegisterType<Services.ProductService>().As<Services.IProductService>(); var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }
- 其中,我們更改了ConfigureServices方法的返回值,由void換成IServiceProvider;此返回為AutofacServiceProvider類的一個實例;在上述過程中,使用了continerBuilder.Populate方法將service(IServiceCollection的實例對象)註入到autofac中。
- 其中為了測試DI能力,我們創建一個IProductService的註入,併在Controller中使用,相關代碼如下:
- IProductService
namespace baseWeb.Services { public interface IProductService { int Get(int id); } }
- ProductService
using System.Collections.Generic; namespace baseWeb.Services { public class ProductService:IProductService { List<int> ls = new List<int>(); public ProductService(){ for(var i=0; i<10; i++){ ls.Add(i+10); } } public int Get(int id){ return ls[id]; } } }
- HomeController
using System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; namespace baseWeb.Controllers { public class HomeController:Controller { private Services.IProductService productService; public HomeController(Services.IProductService productService){ this.productService = productService; } public IActionResult Index(int id){ ViewData["value"] = this.productService.Get(id); return View(); } } }
- 運行結果如下:
五、加入單元測試
在實際開發中,經常需要用到單元測試。.net core的單元測試也是如此的 so easy, fallow me。
- 運行
dotnet new xunit -n baseWebTest
,即可創建一個以xunit為測試框架的單元測試項目 - 運行
dotnet add package Moq
,安裝Moq模擬框架(此命令需要進入到baseWebTest項目文件夾後運行) - 運行
dotnet add reference ../baseWeb/baseWeb.csproj
,將baseWeb項目引入到此項目中。 - 編寫單元測試代碼如下:
using System; using Xunit; using Moq; using baseWeb.Controllers; using baseWeb.Services; using Microsoft.AspNetCore.Mvc; namespace basewebtest { public class DemoTest { [Fact] public void Test1() { var productServiceMock = new Mock<IProductService>(); productServiceMock.Setup(service=>service.Get(1)).Returns((int id)=>{ return id+10; }); var _controller = new HomeController(productServiceMock.Object); var result = _controller.Index(1); var objectResult = Assert.IsType<ViewResult>(result); var destResult = Assert.IsAssignableFrom<int>(objectResult.ViewData["value"]); Assert.Equal(11, destResult); } } }
- 運行
dotnet test -p ./baseWebtest/baseWebtest.csproj
即可,看到如下結果:
六、其他
- 如果你是使用vscode編寫,那麼測試項目是可以在編譯器中進行運行和調試的
- 下載測試源碼