Skip to content

代码生成

本页用于说明 .NET 后端在开发新业务模块时的代码生成与起步方式。

适用场景

  • 已有业务表结构,希望快速生成基础 CRUD 骨架
  • 希望在新模块中保持命名、分层与接口约定一致

推荐方式

  • EF Core Reverse Engineering(从现有数据库生成实体)
  • IDE 代码片段(按团队习惯选择)
  • dotnet-aspnet-codegenerator

EF Core 逆向工程

从现有数据库生成实体类:

bash
dotnet ef dbcontext scaffold "Server=localhost;Port=3306;Database=youlai_admin;User=root;Password=123456" \
  Pomelo.EntityFrameworkCore.MySql \
  --output-dir Domain/Entities \
  --context-dir Infrastructure/Persistence \
  --context YoulaiDbContext \
  --force

模块开发建议

推荐目录结构:Youlai.Application.<Module>

一个最小业务模块通常包含:

  • Entity(领域层)
  • Repository(基础设施层)
  • Service / IService(应用层)
  • Controller(API 层)
  • DTO / Form / Query(应用层)

接口调试入口:http://localhost:8000/swagger

手动创建模块示例

实体类

csharp
// Domain/Entities/SysNotice.cs
public class SysNotice
{
    public long Id { get; set; }
    public string? Title { get; set; }
    public string? Content { get; set; }
    public int Status { get; set; }
    public DateTime CreateTime { get; set; }
}

服务接口

csharp
// Application/System/Services/INoticeService.cs
public interface INoticeService
{
    Task<PageResult<NoticePageDto>> GetNoticePageAsync(NoticeQuery query);
    Task<NoticeForm?> GetNoticeFormAsync(long id);
    Task<bool> SaveNoticeAsync(NoticeForm form);
    Task<bool> DeleteNoticesAsync(string ids);
}

服务实现

csharp
// Infrastructure/Services/NoticeService.cs
internal sealed class NoticeService : INoticeService
{
    private readonly YoulaiDbContext _dbContext;

    public NoticeService(YoulaiDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task<PageResult<NoticePageDto>> GetNoticePageAsync(NoticeQuery query)
    {
        // 实现分页查询逻辑
    }
}

控制器

csharp
// Api/Controllers/System/NoticesController.cs
[ApiController]
[Route("api/v1/notices")]
public class NoticesController : ControllerBase
{
    private readonly INoticeService _noticeService;

    public NoticesController(INoticeService noticeService)
    {
        _noticeService = noticeService;
    }

    [HttpGet]
    public async Task<PageResult<NoticePageDto>> GetNoticePage([FromQuery] NoticeQuery query)
    {
        return await _noticeService.GetNoticePageAsync(query);
    }
}

依赖注入注册

DependencyInjection.cs 中注册服务:

csharp
services.AddScoped<INoticeService, NoticeService>();

基于 MIT 许可发布