nidr 发表于 2017-12-12 07:59:15

搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

  这里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目

首先添加WebApi项目(ASP.NetCore版本)
  右键解决方案>新建项目>
  选择Web>ASP.NET Core Web应用程序(.NET Core)

  选择Web API

  此时的目录结构:


添加实体层Entity
  右键添加>新建项目>.Net Core类库

  添加后的目录结构

  BaseEntity:
  

using System;  

using System.Collections.Generic;  

using System.ComponentModel.DataAnnotations;  

using System.Runtime.Serialization;  

using System.Text;  

  

namespace Entity.Core  
{
  

/// <summary>  
/// DB表基础属性
  
/// </summary>
  
public abstract>  
{
  
public BaseEntity()
  
{
  
CreteTime = DateTime.Now;
  
}
  
/// <summary>
  
/// 主键Id
  
/// </summary>
  
      
  

  
public T>  

  
/// <summary>
  
/// DB版号,Mysql详情参考;http://www.cnblogs.com/shanyou/p/6241612.html
  
/// </summary>
  
////Mysql不允许byte[]类型上标记TimeStamp/RowVersion,这里使用DateTime类型配合标记ConcurrencyCheck达到并发控制
  
      
  
public DateTime RowVersion { get; set; }
  

  
/// <summary>
  
/// 创建时间
  
/// </summary>
  
public DateTime CreteTime { get; set; }
  
}
  
}
  

  Product:
  

using Entity.Core;  

using System;  

using System.Collections.Generic;  

using System.ComponentModel.DataAnnotations;  

using System.Text;  

  

namespace Entity.Table  
{
  

/// <summary>  
/// 商品类
  
/// </summary>
  
public>  
{
  
/// <summary>
  
/// 名称
  
/// </summary>
  

  

  
public string Name { get; set; }
  

  
/// <summary>
  
/// 描述
  
/// </summary>
  

  

  
public string Description { get; set; }
  

  
/// <summary>
  
/// 类别
  
/// </summary>
  

  
public int Category { get; set; }
  

  
/// <summary>
  
/// 原价
  
/// </summary>
  
      
  
public decimal Price { get; set; }
  

  
/// <summary>
  
/// 现价
  
/// </summary>
  
public decimal Discount { get; set; }
  
}
  
}
  


添加数据层DAL:
  右键添加>新建项目>.NET Core 类库

  添加引用:
  Microsoft.EntityFrameworkCore(也可加入Microsoft.AspNetCore.All,但会有用不到的功能造成浪费)
  Microsoft.EntityFrameworkCore.Tools(迁移支持)
  Pomelo.EntityFrameworkCore.MySql(Mysql支持)具体使用细则,请参考:Pomelo.EntityFrameworkCore.MySql使用细则
  

<Project Sdk="Microsoft.NET.Sdk">  

  
<PropertyGroup>
  
<TargetFramework>netcoreapp2.0</TargetFramework>
  
</PropertyGroup>
  

  
<ItemGroup>
  
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />      
  
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10062" />
  
<!--迁移支持必备-->
  
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<!--迁移支持必备-->
  
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<ProjectReference Include="..\Entity\Entity.csproj" />
  
</ItemGroup>
  

  
</Project>
  



添加DbContext数据上下文
  

using Entity.Table;  

using Microsoft.EntityFrameworkCore;  

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

  

namespace DAL  
{
  

public>
{
  

//https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/complex-data-model  
public ProductContext(DbContextOptions<ProductContext> options) : base(options)
  
{
  
//在此可对数据库连接字符串做加解密操作
  
      }
  

  
public DbSet<Product> Courses { get; set; }
  

  

  
protected override void OnModelCreating(ModelBuilder modelBuilder)
  
{
  
base.OnModelCreating(modelBuilder);
  
}
  
}
  
}
  

  ASP.Net Core API项目中引用刚创建的DAL类库

添加Service服务层
  右键添加>新建项目>.NetCore 类库

  添加引用:
  添加Entity和DAL引用,其次再添加第三方数据仓储Microsoft.EntityFrameworkCore.UnitOfWork(最新)
  

<ItemGroup>  
<PackageReference Include="Microsoft.EntityFrameworkCore.UnitOfWork" Version="2.0.1" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<ProjectReference Include="..\DAL\DAL.csproj" />
  
<ProjectReference Include="..\Entity\Entity.csproj" />
  
</ItemGroup>
  

  文件目录如下:

  IProductService:
  

using System;  

using System.Collections.Generic;  

using System.Text;  

  

namespace Service.ProductService  
{
  

public interface IProductService  
{
  

string Test();  
}
  
}
  

  ProductService:
  

using Entity.Table;  

using Microsoft.EntityFrameworkCore;  

  

namespace Service.ProductService  
{
  

public>
{
  

private readonly IUnitOfWork _unitOfWork;  

public ProductService(IUnitOfWork unitOfWork)  
{
  
_unitOfWork
= unitOfWork;  
}
  

  

public string Test()  
{
  

var repo = _unitOfWork.GetRepository<Product>();  
repo.Insert(
new Product  
{
  
Category
= 1,  
Description
= "此商品为澳洲代购,买不了吃亏买不了上当",  
Discount
= (decimal)899.21,  
Price
= (decimal)98.2,  
Name
= "澳洲袋鼠粉",  
});
  
_unitOfWork.SaveChanges();
//提交到数据库  
var result = repo.GetFirstOrDefault()?.Description ?? string.Empty;
  
return result;
  
}
  
}
  
}
  

  ASP.Net Core API添加刚创建的Service类库引用
  

<ItemGroup>  
<ProjectReference Include="..\DAL\DAL.csproj" />
  
<ProjectReference Include="..\Service\Service.csproj" />
  
</ItemGroup>
  

  完整csproj如下:
  

<Project Sdk="Microsoft.NET.Sdk.Web">  

  
<PropertyGroup>
  
<TargetFramework>netcoreapp2.0</TargetFramework>
  
</PropertyGroup>
  

  
<ItemGroup>
  
<Folder Include="wwwroot\" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  
</ItemGroup>
  

  
<ItemGroup>
  
<ProjectReference Include="..\DAL\DAL.csproj" />
  
<ProjectReference Include="..\Service\Service.csproj" />
  
</ItemGroup>
  

  
</Project>
  


控制器中使用service
  

using System.Collections.Generic;using Microsoft.AspNetCore.Mvc;  using Service.ProductService;
  

namespace ASP.Net_Core_API.Controllers  
{
  
[Route(
"api/")]  

public>
{
  

private IProductService _productService;  

  

public ValuesController(IProductService productService)  
{
  
_productService
= productService;  
}
  

// GET api/values  
      
  
public IEnumerable<string> Get()
  
{
  
var result = _productService.Test();
  
return new string[] { "value1", result };
  
}
  
}
  
}
  

  

  Startup文件中加入Mysql支持和对应的需要的注入的service还有UnitOfWork的支持
  完整文件如下:
  

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Threading.Tasks;  

using Microsoft.AspNetCore.Builder;  

using Microsoft.AspNetCore.Hosting;  

using Microsoft.Extensions.Configuration;  

using Microsoft.Extensions.DependencyInjection;  

using Microsoft.Extensions.Logging;  

using Microsoft.Extensions.Options;  

using Microsoft.EntityFrameworkCore;  

using Entity.Table;  

using DAL;  

using Service.ProductService;  

  

namespace ASP.Net_Core_API  
{
  

public>
{  

public Startup(IConfiguration configuration)  
{
  
Configuration
= configuration;  
}
  

  

public IConfiguration Configuration { get; }  

  

// This method gets called by the runtime. Use this method to add services to the container.  
public void ConfigureServices(IServiceCollection services)
  
{
  
services.AddDbContext<ProductContext>(options =>
  
options.UseMySql(Configuration.GetConnectionString("MySqlConnection")));//添加Mysql支持
  

  
services.AddUnitOfWork<ProductContext>();//添加UnitOfWork支持
  
services.AddScoped(typeof(IProductService), typeof(ProductService));//用ASP.NET Core自带依赖注入(DI)注入使用的类
  
services.AddMvc();
  
}
  

  
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  
{
  
if (env.IsDevelopment())
  
{
  
app.UseDeveloperExceptionPage();
  
}
  

  
app.UseMvc();
  
}
  
}
  
}
  


配置appsettings.json中Mysql连接字符串
  

{  

"ConnectionStrings": {  

"MySqlConnection": "Server=localhost;database=NetCore_WebAPI-Mysql;uid=root;pwd=111111;"  
},
  

"Logging": {  

"IncludeScopes": false,  

"Debug": {  

"LogLevel": {  

"Default": "Warning"  
}
  
},
  

"Console": {  

"LogLevel": {  

"Default": "Warning"  
}
  
}
  
}
  
}
  


迁移数据库:
  打开程序包管理器控制台:工具>NuGet包管理器>程序包管理器控制台,默认项目选中包含了DbCOntext的程序集,这里是DAL,程序包源选择全部
  输入:

PM>add-migration init
待执行后输出"To undo this action,use Remove-Migration"表示生成了迁移代码
然后再输入:
PM>update-database
待执行后输出"Done"表示已成功更新数据库  完整操作如下

  Tip:如果是非第一次迁移,就不能再输入PM>add-migration init,而是输入:
  PM>add-migration "对本次迁移的说明"
  例如,本次对Entity的某张表添加了Name属性.迁移时输入PM>add-migration AddName
  输入以上待执行后,依旧输入以下即可
  PM>update-database
  会发现在DAL程序家下成功生成了以下目录

  再打开数据库成功依据实体Entity生成了Product表


运行程序

  成功Run通,奖励个鸡腿压压惊
  专案下载链接:Demo
  github源码链接(持续更新):DotNetCore2.0
页: [1]
查看完整版本: 搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi