天天看點

Net 6.0中實作自動生成代碼

作者:簡單d貓

1、前言

生成代碼NuGet包:XmSoft.CodeGenerator

該包将會自動生成代碼,如:實體,倉儲,服務,控制器及校驗等檔案。

控制器包含CRUD接口:建立,修改,删除,詳情,清單。

參考:ORM架構采用SqlSugar架構生成

2、示例

//建立控制台應用 輸出項目名稱自定義
dotnet new console -o XmSoft.AutoCode 
//引入NuGet
dotnet add package XmSoft.CodeGenerator           
//appsettings.json 配置代碼命名空間及輸出位置
//比如:

{
  "CodeHelperOptions": {
    "ConnectConnectionString": "Server=127.0.0.1;Uid=sa;Pwd=xxxxxxx;Database=test;Port=3306;Charset=utf8;",
    "ProviderName": "MySql.Data.MySqlClient",
    "NameSpace": {
      "ModelsNamespace": "XmSoft.Domain.Models",
      "DomainName": "XmSoft.Domain",
      "DtoNamespace":"XmSoft.ViewModels.Dto",
      "ApiControllerNamespace": "XmSoft.Api.Application",
      "InterfaceName": "XmSoft",
      "ServicesNamespace": "XmSoft.Service",
      "RepositoriesNamespace": "XmSoft.Repository",
      "ValidatorNamespace": "XmSoft.Validation"
    },
    "CodePath": {
      "ModelsPath": "XmSoft.Domain/Models/",
      "DtoPath": "XmSoft.ViewModels/Dto/",
      "IRepositoriesPath": "XmSoft.IRepository/",
      "IServicesPath": "XmSoft.IService/",
      "RepositoriesPath": "XmSoft.Repository/",
      "ServicesPath": "XmSoft.Service/",
      "ControllerPath": "XmSoft.Api/Application/",
      "ValidatorPath": "XmSoft.Validation/"
    }
  }
}
           
//Utility.cs 輸入表名,多個用逗号隔開

public static class Utility
{
    public static string[] WriteTables()
    {
        Console.WriteLine("------------請輸入資料表名稱,多個用逗号隔開------------");
        var strRead = Console.ReadLine();
        var tables = strRead?.Split(',');
        if (string.IsNullOrEmpty(strRead) || tables == null || tables.Length == 0)
        {
            WriteTables();
        }

        return tables ?? Array.Empty<string>();
    }
}
           
//Program.cs 

Console.WriteLine("自動生成代碼");
var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();
var options = configuration.GetSection(nameof(CodeHelperOptions)).Get<CodeHelperOptions>();
var path = Directory.GetCurrentDirectory();


var filterA= @"\XmSoft.AutoCode\bin\Debug\net6.0"; //XmSoft.AutoCode 修改建立的項目名
var filterB = @"\XmSoft.AutoCode\bin\Release\net6.0";

path = path.Replace(filterA, "");
path = path.Replace(filterB, "");

Console.WriteLine(#34;{path}");

options.CodePath.ValidatorPath = Path.Combine(path, @options.CodePath.ValidatorPath);
options.CodePath.ControllerPath = Path.Combine(path, @options.CodePath.ControllerPath);
options.CodePath.ModelsPath = Path.Combine(path, @options.CodePath.ModelsPath);
options.CodePath.IRepositoriesPath = Path.Combine(path, @options.CodePath.IRepositoriesPath);
options.CodePath.IServicesPath = Path.Combine(path, @options.CodePath.IServicesPath);
options.CodePath.RepositoriesPath = Path.Combine(path, @options.CodePath.RepositoriesPath);
options.CodePath.ServicesPath = Path.Combine(path, @options.CodePath.ServicesPath);
options.CodePath.DtoPath = Path.Combine(path, @options.CodePath.DtoPath);

var tables = Utility.WriteTables();
options.Tables = tables;
Console.WriteLine("------------是否确定執行(Y/N)------------");
var command = Console.ReadLine();
if (!string.IsNullOrEmpty(command) && command.ToLower() == "y")
{
    var helper = new CodeGeneratorHelper(options);
    helper.Run();
    Console.WriteLine("------------完成------------");
}

Console.ReadKey();           

3、執行

z_test表sql語句

DROP TABLE IF EXISTS `z_test`;
CREATE TABLE `z_test`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `business_id` bigint(20) NULL DEFAULT NULL COMMENT '業務id',
  `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标題',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容',
  `picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '圖檔',
  `status` int(11) NULL DEFAULT NULL COMMENT '狀态 0 正常 1 關閉',
  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '備注說明',
  `sort` int(11) NULL DEFAULT NULL COMMENT '排序',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '建立Id',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新時間',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新Id',
  `delFlag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '是否删除 1 是,0 否',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '測試表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

補充說明:表必須有個主鍵key           
Net 6.0中實作自動生成代碼

執行

//生成實體
/// <summary>
/// 測試表
/// </summary>
[SugarTable("z_test")]
public partial class Test : BaseBusinessEntity<int?>
{
     /// <summary>
  /// 标題
  /// </summary>
 [SugarColumn(ColumnName = "title")]
  public string Title { get; set; }
     /// <summary>
  /// 内容
  /// </summary>
 [SugarColumn(ColumnName = "content")]
  public string Content { get; set; }
     /// <summary>
  /// 圖檔
  /// </summary>
 [SugarColumn(ColumnName = "picture")]
  public string Picture { get; set; }
     /// <summary>
  /// 狀态 0 正常 1 關閉
  /// </summary>
 [SugarColumn(ColumnName = "status")]
  public int? Status { get; set; }
     /// <summary>
  /// 備注說明
  /// </summary>
 [SugarColumn(ColumnName = "remark")]
  public string Remark { get; set; }
     /// <summary>
  /// 排序
  /// </summary>
 [SugarColumn(ColumnName = "sort")]
  public int? Sort { get; set; }
  }
  
  說明:自定義 BaseBusinessEntity或BaseEntity 自定義,這裡的主鍵名id ,業務id
  
  /// <summary>
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseBusinessEntity<T> : BaseEntity<T>
{
    /// <summary>
    /// 業務Id
    /// </summary>
    [SugarColumn(ColumnName = "business_id")]
    public long? BusinessId { get; set; }
}

public abstract class BaseEntity<T> 
{
    [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]
    public T Id { get; set; }

    /// <summary>
    /// 0未删除 1資源回收筒 2已删除
    /// </summary>
    [SugarColumn(ColumnName = "delFlag")]
    [JsonIgnore]
    public string DelFlag { get; set; }

    /// <summary>
    /// 建立時間
    /// </summary>
    [SugarColumn(ColumnName = "create_time")]
    // [Column("create_time")]
    //[JsonIgnore]
    public DateTime? CreateTime { get; set; }

    /// <summary>
    /// 建立Id
    /// </summary>
    [SugarColumn(ColumnName = "create_by")]
    //[Column("create_id")]
    [JsonIgnore]
    public string Create_By { get; set; }
    /// <summary>
    /// 修改時間
    /// </summary>
    [SugarColumn(ColumnName = "update_time")]
    //[Column("update_time")]
    [JsonIgnore]
    public DateTime? UpdateTime { get; set; }

    /// <summary>
    /// 修改者ID
    /// </summary>
    [SugarColumn(ColumnName = "update_by")]
    //[Column("update_id")]
    [JsonIgnore]
    public string Update_By { get; set; }


    public void Create()
    {
        //Create_By = (userId?.ToString()) ?? Create_By;
        //BusinessId = businessId ?? BusinessId;
        CreateTime = DateTime.Now;
        DelFlag = "0";
    }

    public void Update()
    {
        UpdateTime = DateTime.Now;
    }

}
           
//生成倉儲 EFRepository<Test> 引用XmSoft.Core.SqlSugar.Repository
public sealed class TestRepository :EFRepository<Test>,ITestRepository
{
  public readonly ISqlSugarClient Context;

  public TestRepository(ISqlSugarClient context) : base(context)
 {
     Context = context;

 }

 public ISugarQueryable<Test> SugarQueryable()
 {
     return Context.Queryable<Test>();
 }

}           
//生成服務 引用XmSoft.Core.SqlSugar.Service
public class TestService : BaseService<Test>,ITestService
{
  public TestService(ITestRepository _repository):base(_repository)
  {

  }  

  public async override Task<IResult<bool>> Create(Test entity, dynamic user)
  {
       var validation = new AddTestValidator().Validation(entity);
       if (!validation.Succeeded) return validation.Fail<bool>();

       entity.Create();
       entity.Create_By = user?.UserName;
       entity.BusinessId = user?.BusinessId;

       return await base.Create(entity);
  }

  public async override Task<IResult<int>> Update(Test entity, dynamic user)
  {
       var validation = new UpdateTestValidator().Validation(entity);
       if (!validation.Succeeded) return validation.Fail<int>();

       entity.Update();
       entity.Update_By = user?.UserName;

       return await base.Update(entity);
  }

  public async Task<IResult<Page<Test>>> List(Test model,PageInfo pager,dynamic user)
  {
       long? businessId = user?.BusinessId;

       var predicate = Expressionable.Create<Test>();
       predicate.And(q => q.BusinessId == businessId);
       
       var result = await Page(pager.PageIndex, pager.PageSize, predicate.ToExpression(), q => q.CreateTime, false);

       return result;
  }
}           
//生成Dto
/// <summary>
/// 測試表
/// </summary>
public partial class TestDto
{
     /// <summary>
  /// id
  /// </summary>
  public long Id { get; set; }
     /// <summary>
  /// 業務id
  /// </summary>
  public long? BusinessId { get; set; }
     /// <summary>
  /// 标題
  /// </summary>
  public string Title { get; set; }
     /// <summary>
  /// 内容
  /// </summary>
  public string Content { get; set; }
     /// <summary>
  /// 圖檔
  /// </summary>
  public string Picture { get; set; }
     /// <summary>
  /// 狀态 0 正常 1 關閉
  /// </summary>
  public int? Status { get; set; }
     /// <summary>
  /// 備注說明
  /// </summary>
  public string Remark { get; set; }
     /// <summary>
  /// 排序
  /// </summary>
  public int? Sort { get; set; }
  }           
//生成控制器  BaseAppService 可自定義可繼承 ControllerBase等
/// <summary>
///  測試表
/// </summary>
[Route("test")]
[Tags("測試表")]
public class TestAppService :BaseAppService
{
  private readonly ITestService service;
  

  public TestAppService(ITestService _service)
  {
     service = _service;
  }  
  /// <summary>
  /// 建立測試表
  /// </summary>
  /// <param name="model"></param>
  /// <returns></returns>
  
  [HttpPost]
  [SwaggerResponse(200, Type = typeof(IResult<bool>))]
  [Log(Title = "測試表", BusinessType = BusinessType.INSERT)]
  public IActionResult Create(TestDto model) => service.Create(model.Adapt<Test>(),User).ApiResult();

  /// <summary>
  /// 修改測試表
  /// </summary>
  /// <param name="model"></param>
  /// <returns></returns>
  
  [HttpPut]
  [SwaggerResponse(200, Type = typeof(IResult<int>))]
  [Log(Title = "測試表", BusinessType = BusinessType.UPDATE)]
  public IActionResult Update(TestDto model) => service.Update(model.Adapt<Test>(),User).ApiResult();

  /// <summary>
  /// 删除測試表
  /// </summary>
  /// <param name="id"></param>
  /// <returns></returns>
  
  [HttpDelete("{id}")]
  [SwaggerResponse(200, Type = typeof(IResult<int>))]
  [Log(Title = "測試表", BusinessType = BusinessType.DELETE)]
  public IActionResult Delete(int id) => service.Delete(q=>q.Id == id).ApiResult();

  /// <summary>
  /// 擷取測試表資料
  /// </summary>
  /// <param name="id"></param>
  /// <returns></returns>
  
  [HttpGet("{id}")]
  [SwaggerResponse(200, Type = typeof(IResult<Test>))]
  public IActionResult Info(int id) => service.Info(q => q.Id == id).ApiResult();

  /// <summary>
  /// 測試表清單
  /// </summary>
  /// <param name="model"></param>
  /// <param name="pager"></param>
  /// <returns></returns>
  [HttpGet("list")]
  [SwaggerResponse(200, Type = typeof(IResult<Page<Test>>))]
  public IActionResult List(TestDto model,PageInfo pager) => service.List(model.Adapt<Test>(), pager, User).ApiResult();
 
}
           
Net 6.0中實作自動生成代碼

Swagger顯示效果

注:需要Demo請私信發郵箱           

繼續閱讀