利用dotnet命令行,快速创建简单WEB三层架构

我们要保证dotnet的开发环境和运行已经安装在本地,我们可以利用“
dotnet –version”命令进行检查,如果发现提示命令行不存在,说明环境还没安装,需要先安装,安装过程本文不在详细描述,参考微软的官方说明即可,本文重点在于如何用dotnet命令行,快速构建简单三层架构

一:首先,我们创建好项目的文件夹,然后进入文件夹,创建一个web的应用程序,具体用到的命令是“dotnet new”,dotnet new – 根据指定的模板,创建新的项目、配置文件或解决方案。常用的有类库“classlib”、控制台应用程序“console”、WebAPI应用“webapi”、ASP.NET Core Web 应用程序“webapp”

好了,我们创建一个名称叫Server的WebAPI程序、业务逻辑层的类库BLL、数据交互层DAL和工具层Common

dotnet new webapi -n Server
dotnet new classlib -n BLL
dotnet new classlib -n DAL
dotnet new classlib -n Common

此时,我们可以用visual code看下目录结构

二:我们要让这些类库至今添加引用关系,让Server引用BLL层和Common;BLL层引用DAL层和Common;DAL层引用Common层;这里,我们用到的命令是“dotnet add/list/remove reference”

dotnet add Server/Server.csproj reference BLL/BLL.csproj
dotnet add Server/Server.csproj reference Common/Common.csproj
dotnet add BLL/BLL.csproj reference DAL/DAL.csproj
dotnet add BLL/BLL.csproj reference Common/Common.csproj
dotnet add DAL/DAL.csproj reference Common/Common.csproj

三:接下来我们要在DAL层引入微软推荐的EntityFrameWork框架来进行数据库数据的访问,此处例子,我已经在“.Net Core + EntityFramework连接数据库”一文中有描述,此处只做简单说明,我用MySQL为例,我们需要引入

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

Microsoft.Extensions.Configuration.Json

我们用dotnet add package – 添加或更新项目文件中的包引用。在引用之前,我们可以用dotnet package search 命令搜索 NuGet 包。

dotnet package search Microsoft.EntityFrameworkCore

然后,我们可以选择对应的版本,我这里使用的是8.0.2,进行添加,当然,也可以忽略版本号,用最新版本,前提是你的.net的框架也是最新的,可以兼容此版本

dotnet add DAL/DAL.csproj package Microsoft.EntityFrameworkCore --version 8.0.2
dotnet add DAL/DAL.csproj package Microsoft.EntityFrameworkCore.Design --version 8.0.2
dotnet add DAL/DAL.csproj package Microsoft.EntityFrameworkCore.Tools --version 8.0.2
dotnet add DAL/DAL.csproj package Pomelo.EntityFrameworkCore.MySql --version 8.0.2
dotnet add DAL/DAL.csproj package Microsoft.Extensions.Configuration.Json

三:下面框架和引用已经搭建完成了,我们需要把项目和数据库连接起来,让我们在DAL项目里面新建一个appsettings.json配置文件,把mysql的数据库连接字符串写上,里面填上你的数据库ip,用户名,密码,以及你想存放的数据库名称

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Port=3306;Database=数据库名称;User=root;Password=你的mysql密码;Charset=utf8mb4;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

在DAL项目里创建Modles文件夹用来存放数据库对象,比如User类,对应数据库User表

namespace DAL.Models;
using System.ComponentModel.DataAnnotations.Schema;

public class User
{
  [Column("Id")]
  public int Id { get; set; }
  
  [Column("UserName")]
  public string? UserName { get; set; }
}

在DAL项目里创建Contexts文件用来存放上下文类,此类建议和数据库名称一一对应

namespace DAL.Contexts;
using Microsoft.EntityFrameworkCore;
using DAL.Models;
using Microsoft.Extensions.Configuration;

public class webapplicationContext : DbContext
{
  public webapplicationContext()
  {
    Configuration = new ConfigurationBuilder().SetBasePath(AppDomain.CurrentDomain.BaseDirectory).AddJsonFile("appsettings.json").Build();
  }
  public IConfiguration Configuration;
  public required DbSet<User> Users { get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
  }
}

四:初始化数据库,当我们完成了项目基本的搭建,这时候,我们需要用Entity Framework Core 的命令行工具,创建数据库,首先我们打开终端,定位到项目所在位置,然后,就可以用ef命令来初始化数据库,如图所示

cd DAL
dotnet ef migrations add InitialCreate
dotnet ef database update

完成后,发现我们对应的数据库就会有对应的库和表了

关于EntityFramWork的操作,请参考.Net Core+Entity Framework读写数据

下面,让我们回到Server文件夹下,运行dotnet run命令,找到对应端口,访问网页http://localhost:端口/swagger/index.html,看看是否正常

cd ..
cd Server
dotnet run

最后,我们可以给项目文件根里添加.gitignore文件,忽略bin文件,方便以后版本控制

*.log
temp/
.vs/
BLL/bin
BLL/obj
DAL/bin
DAL/obj
Server/bin
Server/obj
Common/bin
Common/obj

我们也可以在Server项目里新建Controllers文件夹,用来存放控制类

using Microsoft.AspNetCore.Mvc;

namespace Server.Controllers;

[ApiController]
[Route("api/[controller]")]
public class WeatherForcecastController : ControllerBase
{
    private readonly ILogger<WeatherForcecastController> _logger;

    public WeatherForcecastController(ILogger<WeatherForcecastController> logger)
    {
        _logger = logger;
    }

    private static readonly string[] Summaries = new[]
    {
      "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> GetWeatherForecast()
    {
        var forecast =  Enumerable.Range(1, 5).Select(index =>  new WeatherForecast
        (
          DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
          Random.Shared.Next(-20, 55),
          Summaries[Random.Shared.Next(Summaries.Length)]
        )).ToArray();
        return forecast;
    }

    public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
    {
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

最后把Server/Program.cs文件调整一下,加载控制类

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.MapControllers();
app.Run();

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注