来份ASP.NET Core尝尝

0x01、前言

学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是

略懂一二。如果有错误,还望见谅。

本文还是和之前一样,Demo+在Linux下运行(CentOS7+dotnetcore sdk)

开发环境:win10+vs2015+sqlserver2014

0x02、demo

新建一个ASP.NET Core Web Application项目--Catcher.EasyDemo.Website

干掉Controllers文件夹。由于个人习惯问题,习惯性将Controller分离出来。

新建三个Class Library项目:

Catcher.EasyDemo.Controllers:剥离出来的Controller

Catcher.EasyDemo.DataAccess:数据访问

Catcher.EasyDemo.Models:模型

Controller项目需要添加MVC的引用:"Microsoft.AspNetCore.Mvc": "1.0.0"

在Controllers中添加HomeController,内容和生成的是一样的。然后在Website中添加引用,这里有

两种方式,一种是和平常一样的右键->添加引用,另一种是在project.json中的dependencies节点下

面添加 "Catcher.EasyDemo.Controllers": "1.0.0-*",然后就会自动restore,完成之后就能正常跑起

来了。(这里就不截图了)

下面的话,在Models中添加一个Product类:

 1 namespace Catcher.EasyDemo.Models
 2 {
 3     public class Product
 4     {
 5         public int ProductId { get; set; }
 6         public string ProductName { get; set; }
 7         public string ProductSource { get; set; }
 8         public decimal ProductPrice { get; set; }
 9     }
10 }

在DataAccess中添加ProductDataAccess类,用于数据交互,里面有用到dapper,所以要添加引用,

以及用到了读取json配置的方法,所以还要添加Microsoft.Extensions.Configuration的引用,同时还要添加Models的引用,方法上面已经说过了。

这里没有用一些复杂的东西,就一个单例模式和一些简单的数据库操作。

  1 using Catcher.EasyDemo.Models;
  2 using Dapper;
  3 using Microsoft.Extensions.Configuration;
  4 using System.Collections.Generic;
  5 using System.Data;
  6 using System.Data.SqlClient;
  7 using System.IO;
  8 using System.Linq;
  9
 10 namespace Catcher.EasyDemo.DataAccess
 11 {
 12     public sealed class ProductDataAccess
 13     {
 14         public static ProductDataAccess Instance
 15         {
 16             get
 17             {
 18                 return Nested.instance;
 19             }
 20         }
 21
 22         class Nested
 23         {
 24             static Nested() { }
 25             internal static readonly ProductDataAccess instance = new ProductDataAccess();
 26         }
 27
 28         /// <summary>
 29         /// get the connection string form the appsettings.json
 30         /// </summary>
 31         /// <returns></returns>
 32         private string GetConnStr()
 33         {
 34             var builder = new ConfigurationBuilder();
 35             builder.SetBasePath(Directory.GetCurrentDirectory());
 36             builder.AddJsonFile("appsettings.json");
 37             var config = builder.Build();
 38             return config.GetConnectionString("dapperConn");
 39         }
 40
 41         /// <summary>
 42         /// open the connection
 43         /// </summary>
 44         /// <returns></returns>
 45         private SqlConnection OpenConnection()
 46         {
 47             SqlConnection conn = new SqlConnection(GetConnStr());
 48             conn.Open();
 49             return conn;
 50         }
 51
 52         /// <summary>
 53         /// get all products
 54         /// </summary>
 55         /// <returns></returns>
 56         public IList<Product> GetAll()
 57         {
 58             using (IDbConnection conn = OpenConnection())
 59             {
 60                 string sql = @"SELECT [ProductId]
 61                                   ,[ProductName]
 62                                   ,[ProductSource]
 63                                   ,[ProductPrice]
 64                               FROM [dbo].[Product]";
 65                 return conn.Query<Product>(sql).ToList();
 66             }
 67         }
 68
 69         /// <summary>
 70         /// delete the product by product‘s id
 71         /// </summary>
 72         /// <param name="pid">id of the product</param>
 73         /// <returns></returns>
 74         public bool Delete(int pid)
 75         {
 76             using (IDbConnection conn = OpenConnection())
 77             {
 78                 string sql = string.Format(@"DELETE FROM [dbo].[Product] WHERE [ProductId]={0} ", pid.ToString());
 79                 return conn.Execute(sql) > 0;
 80             }
 81         }
 82
 83         /// <summary>
 84         /// add the product
 85         /// </summary>
 86         /// <param name="product">entity of the product</param>
 87         /// <returns></returns>
 88         public bool Add(Product product)
 89         {
 90             using (IDbConnection conn = OpenConnection())
 91             {
 92                 string sql = string.Format(@"INSERT INTO [dbo].[Product]
 93            ([ProductName]
 94            ,[ProductSource]
 95            ,[ProductPrice])
 96      VALUES
 97            (‘{0}‘,‘{1}‘,{2})", product.ProductName, product.ProductSource, product.ProductPrice);
 98                 return conn.Execute(sql) > 0;
 99             }
100         }
101     }
102 }

然后在Controllers中添加一个ProductController,具体内容如下:

 1 using Microsoft.AspNetCore.Mvc;
 2 using Catcher.EasyDemo.Models;
 3 using Catcher.EasyDemo.DataAccess;
 4
 5 namespace Catcher.EasyDemo.Controllers
 6 {
 7     public class ProductController :  Controller
 8     {
 9         /// <summary>
10         /// Index
11         /// </summary>
12         /// <returns></returns>
13         public IActionResult Index()
14         {
15             return View(ProductDataAccess.Instance.GetAll());
16         }
17
18         /// <summary>
19         /// Add
20         /// </summary>
21         /// <returns></returns>
22         public IActionResult Add()
23         {
24             return View();
25         }
26         [HttpPost]
27         public IActionResult Add(Product product)
28         {
29             bool isOK = ProductDataAccess.Instance.Add(product);
30
31             if (isOK)
32             {
33                 return RedirectToAction("Index");
34             }
35             else
36             {
37                 TempData["err"] = "sorry!there were some errors!Please try again.";
38                 return View();
39             }
40         }
41
42         /// <summary>
43         /// Delete
44         /// </summary>
45         /// <param name="pid"></param>
46         /// <returns></returns>
47         public IActionResult Delete(int pid)
48         {
49             bool isOK = ProductDataAccess.Instance.Delete(pid);
50
51             if (isOK)
52             {
53                 return RedirectToAction("Index");
54             }
55             else
56             {
57                 TempData["err"] = "sorry!there were some errors!Please try again.";
58                 return View("Index");
59             }
60         }
61     }
62 }

控制器的话,应该没有什么太多好说的,毕竟差别不会太大。

下面要做的就是添加视图和连接字符串。

先添加视图:添加一个Product文件夹,在这里存放相应的视图

添加Index.cshtml

 1 @model IEnumerable<Catcher.EasyDemo.Models.Product>
 2 @{
 3     ViewData["Title"] = "Product Index";
 4 }
 5 <a asp-action="Add" asp-controller="Product">Add a New Product</a>
 6 <div class="container">
 7     <table class="table table-responsive">
 8
 9         <thead>
10             <tr>
11                 <td>ID</td>
12                 <td>Name</td>
13                 <td>Price</td>
14                 <td>Source</td>
15                 <td>Opreation</td>
16             </tr>
17         </thead>
18
19         <tbody>
20             @foreach (var item in Model)
21             {
22                 <tr>
23                     <td>@item.ProductId</td>
24                     <td>@item.ProductName</td>
25                     <td>@item.ProductPrice</td>
26                     <td>@item.ProductSource</td>
27                     <td>
28                         <a asp-action="Delete" asp-controller="Product" asp-route-pid="@item.ProductId">Delete</a>
29                     </td>
30                 </tr>
31             }
32         </tbody>
33     </table>
34 </div>

视图与mvc用的法大致相同,不同就是TagHelper,不过大部分是一看就知道是什么意思,要做什么操作,也不做过多解释。

添加Add.cshtml

 1 @model Catcher.EasyDemo.Models.Product
 2 @{
 3     ViewData["Title"] = "Add";
 4 }
 5 <div class="container">
 6     <form asp-action="Add" asp-controller="Product" method="post">
 7         <div class="form-group">
 8             <label asp-for="ProductName">Name</label>
 9             <input asp-for="ProductName" type="text" placeholder="enter the product name" />
10         </div>
11         <div class="form-group">
12             <label asp-for="ProductPrice">Price</label>
13             <input asp-for="ProductPrice" type="text" placeholder="enter the product price" />
14         </div>
15         <div class="form-group">
16             <label asp-for="ProductSource">Source</label>
17             <input asp-for="ProductSource" type="text" placeholder="enter the product source" />
18         </div>
19         <div class="form-group">
20             <button type="submit" class="btn btn-primary">Add Product</button>
21         </div>
22     </form>
23 </div>

还要添加的是连接字符串,在appsettings.json中添加一个节点

1 "connectionStrings": {
2     "dapperConn": "server=127.0.0.1;database=nancydemo;user id=sa;password=123;"
3   }

当然,这是在本地的,放到linux时,需要替换成相应的ip

来一张项目截图:

到这里,编码工作已经ok了,编译,发布即可

0x03、Linux下运行

这里没有采用jexus的方式部署,原因是想尝尝另外的方式。

在CentOS上安装dotnet core的方式可以看这里,就不在累赘了

https://www.microsoft.com/net/core#centos

安装好了之后,运行dotnet会提示

确定dotnet core 安装成功之后,

就是把发布后的项目扔到CentOS中,习惯放到/var/www目录下面

进入到相应的目录,运行dotnet 网站对应的dll即可

并且,在终端还能查看一系列的操作

总之,dotNET Core 用起来感觉不错

时间: 07-31

来份ASP.NET Core尝尝的相关文章

做个简单的RSS订阅(ASP.NET Core),节省自己的时间

0x01 前言 因为每天上下班路上,午休前,都是看看新闻,但是种类繁多,又要自己找感兴趣的,所以肯定会耗费不少时间. 虽说现在有很多软件也可以订阅一些自己喜欢的新闻,要安装到手机,还是挺麻烦的.所以就突发奇想,把一些新闻资源 整合一下,省时省力,就根据RSS订阅,用h5结合ASP.NET Core做个小站点,方便一下自己,顺便拿dotNET Core练练手. 开发环境:win10+vs2015+sqlite+redis(windows) 部署环境:centos7+.net core sdk+je

ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存

.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对Redis和SQL Server的原生支持.除了这个独立的缓存系统之外,ASP.NET Core还借助一个中间件实现了“响应缓存”,它会按照HTTP缓存规范对整个响应实施缓存.不过按照惯例,在对缓存进行系统介绍之前,我们还是先通过一些简单的实例演示感知一下如果在一个ASP.NET Core应用中如何

一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

原文地址: http://www.cnblogs.com/daxnet/p/6139317.html 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些与编程和开发相关的文章.从入行到现在,我至始至终乐于与网友分享自己的所学所得,希望会有更多的同我一样的业内朋友能够在事业上取得成功,也算是为我们的软件事业贡献自己的一份力量吧,这也是我在博客园建博客

ASP.NET Core中使用xUnit进行单元测试

单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多说了,有单元测试的做兜底的项目,好比给开发人员买了份保险,当然这个保险的质量取决于单元测试的质量,那些一路Mock的单元测试,看起来很美,但是什么都cover不到.目前工作中的一个老项目,有2万多个单元测试用例,其中不少是用心之作,真正落实到了业务逻辑,开发人员可以放心的去修改代码,当然一切都必须按

基于Microsoft Azure、ASP.NET Core和Docker的博客系统

欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网")个人空间发布过一些与编程和开发相关的文章.从入行到现在,我至始至终乐于与网友分享自己的所学所得,希望会有更多的同我一样的业内朋友能够在事业上取得成功,也算是为我们的软件事业贡献自己的一份力

Asp.net Core 初探(发布和部署Linux)

前言 俗话说三天不学习,赶不上刘少奇.Asp.net Core更新这么长时间一直观望,周末帝都小雨,宅在家看了下Core Web App,顺便搭建了个HelloWorld环境来尝尝鲜,第一次看到.Net Web运行在Linux上还是有点小激动(只可惜微软走这一步路走的太晚,要不然屌丝们也不会每每遇见Java VS .Net就想辩论个你死我活). 开发环境和部署环境 Windows 10.VS2015 Update3.安装.Net Core SDK.DotNetCore.1.0.1-VS2015T

Asp.net Core 使用Redis存储Session

前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一,很多人直接说不要用,也有很多人在用,这个也没有绝对的这义,个人认为只要不影什么且又可以方便实现的东西是可以用的,现在不对可不可用做表态,我们只关心实现. 类库引用 这个相对于之前的.net是方便了不少,需要在project.json中的dependencies节点中添加如下内容: "StackExc

将ASP.NET Core应用程序部署至生产环境中(CentOS7)

阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方案,今天就跟大家分享一下如何将ASP.NET Core应用程序以生产

细说ASP.NET Core静态文件的缓存方式

2016-11-26 张磊 dotNET跨平台 一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述.当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容. 本文重点展示如何通过StaticFileMiddleware中间件,提高网站的性能.虽然这不是唯一缓存文件的方式,我