本文章主要说明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编写,那么测试项目是可以在编译器中进行运行和调试的
- 下载测试源码