CC.CodeGenerator 1.8.1.709

There is a newer version of this package available.
See the version list below for details.
dotnet add package CC.CodeGenerator --version 1.8.1.709
NuGet\Install-Package CC.CodeGenerator -Version 1.8.1.709
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CC.CodeGenerator" Version="1.8.1.709" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add CC.CodeGenerator --version 1.8.1.709
#r "nuget: CC.CodeGenerator, 1.8.1.709"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install CC.CodeGenerator as a Cake Addin
#addin nuget:?package=CC.CodeGenerator&version=1.8.1.709

// Install CC.CodeGenerator as a Cake Tool
#tool nuget:?package=CC.CodeGenerator&version=1.8.1.709

CC.CodeGenerator

利用.Net的Source Generator功能,生成开发过程中哪些无聊的代码。

优势

  • 代码实时生成,无需额外操作,立即生效
  • 开发过程中生成的代码,执行性能比运行时反射更有效率

效果演示

GIF 2022-1-21 13-44-18

视频介绍

https://www.bilibili.com/video/BV1Am4y1S7QT?share_source=copy_web https://www.bilibili.com/video/BV1a3411Y7xb?share_source=copy_web https://www.bilibili.com/video/BV14m4y1S7Ne?share_source=copy_web

使用方法

1. 安装

安装代码生成包以及支持包

Install-Package CC.CodeGenerator
Install-Package CC.NetCore

因为VS的原因,在添加包引用或者升级包版本后,建议重启VS。

Program.cs中添加全局引用

global using CC.CodeGenerator;

2. 对象Mapping

Mapping

启用对象映射,可指定多个映射对象

MappingIgnore

忽略不需要的属性

[Mapping(typeof(People2Map), typeof(People3Map))]
public partial class People1Map
{
    public Guid PeopleId { get; set; }
    public string UserName { get; set; }
    public string City { get; set; }
    public string Disply => $"{UserName}";
}

public class People2Map
{
    public Guid PeopleId { get; set; }
    public string UserName { get; set; }
}

public class People3Map
{
    public string City { get; set; }

}

进行对象之间的赋值

//初始新的Dto
var people1Map = new People1Map() { PeopleId=Guid.NewGuid(),UserName="Tim" };
var people2Map = new People2Map();
var people3Map = new People3Map() { City="ShangHai"};

//复制到对象
people1Map.CopyTo(people2Map);

//从对象复制来
people1Map.CopyFrom(people3Map);

//从别的对象初始化
var people4Map = new People1Map(people2Map);


3. EF检索中Mapping

简化在EF的Select中的无意义赋值代码,并能从多个对象汇获取数据

数据库表关系图

DB

返回的对象增加Mapping特性

[Mapping(typeof(People), typeof(City))]
public partial class PeopleViewDto
{
    public Guid PeopleId { get; set; }
    public string Name { get; set; }
    public string CityTitle { get; set; }
    public List<SkillViewDto> SkillViews { get; set; }
}

[Mapping(typeof(Skill))]
public partial class SkillViewDto
{
    public Guid SkillId { get; set; }
    public Guid PeopleId { get; set; }
}

使用示例

☹️常规代码

var PeopleViewDtos1 = context.People
    .Select(x => new PeopleViewDto(x)
        {
            CityTitle = x.City.CityTitle,
            SkillViews = x.Skill.Select(y => new SkillViewDto()
            {
                PeopleId=y.PeopleId,
                SkillId=y.SkillId,
                SkillName=y.SkillName,
            }).ToList()
        })
    .ToList();

😁简化代码



var PeopleViewDtos2 = context.People
    .Select(x => new PeopleViewDto(x) //赋值直接通过对象构造完成
        {
            SkillViews = x.Skill.Select(y => new SkillViewDto(y)).ToList()
        }
    .CopyFrom(x.City)) //通过级联CopyFrom函数可以从多个实体获得数据
    .ToList();

4. 服务注册及依赖注入代码自动创建

Service

自动创建服务注册代码,让Program更加清洁

  • LifeCycle:自定义生命周期,默认Scoped

AutoInject

自动创建注入代码

Program.cs中标记注册位置

var builder = WebApplication.CreateBuilder(args);

CC.CodeGenerator.AutoDI.AddServices(builder);//加入此行代码

使用示例

☹️常规代码

//Program.cs
builder.Services.AddScoped<DemoService1>();
builder.Services.AddScoped<DemoService2>();
builder.Services.AddScoped<DemoService4>();

//Service.cs
public class DemoService1 { }

public class DemoService2 { }

public partial class DemoService4
{
    private readonly DemoService1 DemoService1;
    private readonly DemoService2 DS2;

    public DemoService4(DemoService1 injectDemoService1, DemoService2 injectDS2)
    {
        DemoService1 = injectDemoService1;
        DS2 = injectDS2;
    }
}

😁简化代码

//Program.cs
CC.CodeGenerator.AutoDI.AddServices(builder);

//Service.cs
[Service] //通过特性实现服务注册
public class DemoService1 { }

[Service]
public class DemoService2 { }

[Service]
[AutoInject(typeof(DemoService1))] //通过特性实现服务注入
[AutoInject(typeof(DemoService2),"DS2")]
public partial class DemoService4 { }

5. 增强数据交换对象及简化EF

Dto

增强实体特性,提供对象赋值,默认增删改查代码

  • Context:上下文对象
  • Entity:映射的EF实体

Ignore

忽略不需要的属性

示例

[Dto(Context=nameof(DemoaContext),Entity =typeof(People))]
public partial record PeopleDto
{
    public Guid PeopleId { get; set; }
    public string UserName { get; set; }
    public string City { get; set; }
    [DtoIgnore]
    public string Disply => $"{UserName}";
}

示例

var context = new DemoaContext();

//创建Dto
var secondDto = new PeopleDto() { City = "ShangHai" };

//初始新的Dto
var firstDto = PeopleDto.NewGen();

//快速从Dto复制
firstDto.CopyFormDto(secondDto);

//EF快速Select
var peopleEntityDtos = context.People.Where(x=>x.City == "ShangHai").ToPeopleDtos();

//快速载入Dto
var peopleEntityDto = PeopleDto.LoadGen(context, new Guid(""));

//Dto复制到实体
var peopleEntity = context.People.FirstOrDefault();
peopleEntityDto.CopyToEntity(peopleEntity);

//Dto重新载入
peopleEntityDto.ReLoadGen(context);

//Dto快速保存
peopleEntityDto.City = "北京";
peopleEntityDto.SaveGen(context);

//Dto快速删除
peopleEntityDto.DeleteGen(context);

//主键快速删除
PeopleDto.DeleteGen(context, new Guid("25fcf1e5-a47c-432a-b2c6-25a2a09a5e01"));

//最后保存操作
context.SaveChanges();

6. 自动创建选项代码

AutoOption

  • FieldName

选项字段名

  • Options

可选项目,使用“代码:存储:显示”格式,采用换行或“;”分割,示例:

  • 1:Option1:选项1
  • 2:Option2:选项2

示例

    [AutoOption("Sex", @"
Female:0:女
Male:1:男
")]
    public partial class People
    {
    }

生成代码如下

public partial class People
{
    public class ESex
    {
        [DisplayName("女")]
        public static string Female { get; set; } = "0";
        [DisplayName("男")]
        public static string Male { get; set; } = "1";
    }

    public static List<OptionCore> ESexOption {get; } = new List<OptionCore>()
    {
        new OptionCore("0","女"),
        new OptionCore("1","男"),
    };

    public static List<OptionCore> ESexFilter {get; } = new List<OptionCore>()
    {
        new OptionCore("","全部"),
        new OptionCore("0","女"),
        new OptionCore("1","男"),
    };
}

7. 自动实现INotifyPropertyChanged接口

[AddNotifyPropertyChanged("Id", typeof(long), XmlSummary = "从类上创建属性")]
partial class Demo0
{
    [AddNotifyPropertyChanged(XmlSummary = "从字段创建属性")]
    private string _name;
}

生成代码如下

partial class Demo0  : INotifyPropertyChanged
{
    
    #region 接口相关
    
    public event PropertyChangedEventHandler? PropertyChanged;
    
    private bool SetProperty<T>(ref T storage, T value , [CallerMemberName] string? propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(storage, value)) return false;
        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }
    
    private void OnPropertyChanged(string? propertyName) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
    #endregion
    
    #region 生成的属性和字段

    private long _id;
    /// <summary>
    /// 从类上创建属性
    /// </summary>
    public long Id
    {
        get => _id;
        set => SetProperty(ref _id, value);
    }
    
    /// <summary>
    /// 从字段创建属性
    /// </summary>
    public string? Name
    {
        get => _name;
        set => SetProperty(ref _name, value);
    }

    #endregion
}
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2023.5.329 249 3/29/2023
2023.4.325 204 3/25/2023
2023.3.304 246 3/4/2023
1.9.1.725 492 7/25/2022
1.9.0.723 382 7/23/2022
1.8.4.721 395 7/21/2022
1.8.3.719 414 7/19/2022
1.8.2.716 470 7/16/2022
1.8.1.709 435 7/9/2022
1.8.0.709 415 7/9/2022
1.7.0.617 413 6/17/2022
1.6.1.616 420 6/16/2022
1.6.0.508 424 5/8/2022
1.5.3.505 385 5/6/2022
1.4.3 414 5/4/2022
1.3.0 418 3/19/2022
1.2.0 403 3/12/2022
1.1.3 446 3/9/2022
1.1.1 434 1/26/2022
1.1.0 431 1/23/2022
1.0.18 451 1/21/2022
1.0.17 390 1/21/2022
1.0.16 396 1/19/2022