软件: Keil esp固件烧写软件 华为云服务器(个人免费使用,每天消息上限) 二、调试过程 调试总体思路: 烧写官方的MQTT固 ...
梢泊型姓为什么需要类似Lombok的工具在现代软件开发中我们经常需要编写大量重复的样板代码例如依赖注入为服务类编写构造函数注入代码数据传输对象(DTO)为实体类创建对应的DTO类Builder模式为复杂对象创建Builder构建器属性访问器为私有字段生成公共属性映射方法在不同对象之间进行属性映射这些样板代码不仅占用大量时间编写还容易出错且难以维护。通过代码生成工具我们可以自动化这些重复性工作让开发者专注于业务逻辑的实现。Mud代码生成器Mud代码生成器是一套基于Roslyn的源代码生成器专门针对.NET平台设计提供了类似Lombok的功能甚至更加丰富。它包含两个主要组件Mud.EntityCodeGenerator实体代码生成器用于根据实体类自动生成各种相关代码Mud.ServiceCodeGenerator服务代码生成器用于自动生成服务层相关代码这套工具通过在代码中添加特定的特性(Attribute)标记然后在编译时自动生成相应的代码大大减少了开发者需要手动编写的代码量。核心功能1. 生成构造函数注入代码在.NET的依赖注入系统中构造函数注入是最推荐的依赖注入方式。然而手动编写构造函数注入代码可能会很繁琐特别是当一个类需要注入多个服务时。Mud.ServiceCodeGenerator提供了多种注入特性可以自动生成构造函数注入代码ConstructorInjectAttribute 字段注入使用[ConstructorInject]特性可以将类中已存在的私有只读字段通过构造函数注入初始化[ConstructorInject]public partial class UserService{private readonly IUserRepository _userRepository;private readonly IRoleRepository _roleRepository;// 生成的代码将包含:// public UserService(IUserRepository userRepository, IRoleRepository roleRepository)// {// _userRepository userRepository;// _roleRepository roleRepository;// }}LoggerInjectAttribute 日志注入使用[LoggerInject]特性可以为类注入ILogger类型的日志记录器[LoggerInject]public partial class UserService{// 生成的代码将包含:// private readonly ILogger _logger;//// public UserService(ILoggerFactory loggerFactory)// {// _logger loggerFactory.CreateLogger();// }}CacheInjectAttribute 缓存管理器注入使用[CacheInject]特性可以注入缓存管理器实例[CacheInject]public partial class UserService{// 生成的代码将包含:// private readonly ICacheManager _cacheManager;//// public UserService(ICacheManager cacheManager)// {// _cacheManager cacheManager;// }}UserInjectAttribute 用户管理器注入使用[UserInject]特性可以注入用户管理器实例[UserInject]public partial class UserService{// 生成的代码将包含:// private readonly IUserManager _userManager;//// public UserService(IUserManager userManager)// {// _userManager userManager;// }}OptionsInjectAttribute 配置项注入使用[OptionsInject]特性可以根据指定的配置项类型注入配置实例[OptionsInject(OptionType TenantOptions)]public partial class UserService{// 生成的代码将包含:// private readonly TenantOptions _tenantOptions;//// public UserService(IOptions tenantOptions)// {// _tenantOptions tenantOptions.Value;// }}CustomInjectAttribute 自定义注入使用[CustomInject]特性可以注入任意类型的依赖项[CustomInject(VarType IRepository, VarName _userRepository)][CustomInject(VarType INotificationService, VarName _notificationService)]public partial class UserService{// 生成的代码将包含:// private readonly IRepository _userRepository;// private readonly INotificationService _notificationService;//// public UserService(IRepository userRepository, INotificationService notificationService)// {// _userRepository userRepository;// _notificationService notificationService;// }}组合注入示例多种注入特性可以组合使用生成器会自动合并所有注入需求[ConstructorInject][LoggerInject][CacheInject][UserInject][OptionsInject(OptionType TenantOptions)][CustomInject(VarType IRepository, VarName _userRepository)]public partial class UserService{private readonly IRoleRepository _roleRepository;private readonly IPermissionRepository _permissionRepository;// 生成的代码将包含所有注入项:// private readonly ILogger _logger;// private readonly ICacheManager _cacheManager;// private readonly IUserManager _userManager;// private readonly TenantOptions _tenantOptions;// private readonly IRepository _userRepository;// private readonly IRoleRepository _roleRepository;// private readonly IPermissionRepository _permissionRepository;//// public UserService(// ILoggerFactory loggerFactory,// ICacheManager cacheManager,// IUserManager userManager,// IOptions tenantOptions,// IRepository userRepository,// IRoleRepository roleRepository,// IPermissionRepository permissionRepository)// {// _logger loggerFactory.CreateLogger();// _cacheManager cacheManager;// _userManager userManager;// _tenantOptions tenantOptions.Value;// _userRepository userRepository;// _roleRepository roleRepository;// _permissionRepository permissionRepository;// }}2. Builder模式代码生成Builder模式是一种创建型设计模式能够分步骤创建复杂对象。使用Builder模式可以创建不同表现的对象同时避免构造函数参数过多的问题。Mud.EntityCodeGenerator支持通过[Builder]特性自动生成Builder构建器模式代码////// 客户端信息实体类///[DtoGenerator][Builder][Table(Name sys_client),SuppressSniffer]public partial class SysClientEntity{////// id///[property: Column(Name id, IsPrimary true, Position 1)][property: Required(ErrorMessage id不能为空)]private long? _id;////// 客户端key///[property: Column(Name client_key, Position 3)][property: Required(ErrorMessage 客户端key不能为空)]private string _clientKey;////// 删除标志0代表存在 2代表删除///[property: Column(Name del_flag, Position 10)]private string _delFlag;}基于以上实体将自动生成Builder构建器类////// 的构建者。///public class SysClientEntityBuilder{private SysClientEntity _sysClientEntity new SysClientEntity();////// 设置 属性值。//////属性值/// 返回 实例public SysClientEntityBuilder SetId(long? id){this._sysClientEntity.Id id;return this;}////// 设置 属性值。//////属性值/// 返回 实例public SysClientEntityBuilder SetClientKey(string clientKey){this._sysClientEntity.ClientKey clientKey;return this;}////// 设置 属性值。//////属性值/// 返回 实例public SysClientEntityBuilder SetDelFlag(string delFlag){this._sysClientEntity.DelFlag delFlag;return this;}////// 构建 类的实例。///public SysClientEntity Build(){return this._sysClientEntity;}}使用Builder模式可以链式设置实体属性创建实体对象更加方便var client new SysClientEntityBuilder().SetClientKey(client123).SetDelFlag(0).Build();3. DTO/VO代码生成在现代Web应用开发中数据传输对象(DTO)和视图对象(VO)是常见的设计模式。它们用于在不同层之间传输数据避免直接暴露实体类。Mud.EntityCodeGenerator可以自动生成DTO和VO类////// 客户端信息实体类///[DtoGenerator][Table(Name sys_client),SuppressSniffer]public partial class SysClientEntity{////// id///[property: TableField(Fille FieldFill.Insert, Value FillValue.Id)][property: Column(Name id, IsPrimary true, Position 1)][property: Required(ErrorMessage id不能为空)]private long? _id;////// 客户端key///[property: Column(Name client_key, Position 3)][property: Required(ErrorMessage 客户端key不能为空)][property: ExportProperty(客户端key)][property: CustomVo1, CustomVo2][property: CustomBo1, CustomBo2]private string _clientKey;////// 删除标志0代表存在 2代表删除///[property: Column(Name del_flag, Position 10)][property: ExportProperty(删除标志)][IgnoreQuery]private string _delFlag;}基于以上实体将自动生成以下几类代码VO类 (视图对象)////// 客户端信息实体类///[SuppressSniffer, CompilerGenerated]public partial class SysClientListOutput{////// id///public long? id { get; set; }////// 客户端key///[ExportProperty(客户端key)][CustomVo1, CustomVo2]public string? clientKey { get; set; }////// 删除标志0代表存在 2代表删除///[ExportProperty(删除标志)]public string? delFlag { get; set; }}QueryInput类 (查询输入对象)// SysClientQueryInput.g.cs////// 客户端信息实体类///[SuppressSniffer, CompilerGenerated]public partial class SysClientQueryInput : DataQueryInput{////// id///public long? id { get; set; }////// 客户端key///public string? clientKey { get; set; }////// 删除标志0代表存在 2代表删除///public string? delFlag { get; set; }////// 构建通用的查询条件。///public Expression BuildQueryWhere(){var where LinqExtensions.True();where where.AndIF(this.id ! null, x x.Id this.id);where where.AndIF(!string.IsNullOrEmpty(this.clientKey), x x.ClientKey this.clientKey);where where.AndIF(!string.IsNullOrEmpty(this.delFlag), x x.DelFlag this.delFlag);return where;}}CrInput类 (创建输入对象)// SysClientCrInput.g.cs////// 客户端信息实体类///[SuppressSniffer, CompilerGenerated]public partial class SysClientCrInput{////// 客户端key///[Required(ErrorMessage 客户端key不能为空), CustomBo1, CustomBo2]public string? clientKey { get; set; }////// 删除标志0代表存在 2代表删除///public string? delFlag { get; set; }////// 通用的BO对象映射至实体方法。///public virtual SysClientEntity MapTo(){var entity new SysClientEntity();entity.ClientKey this.clientKey;entity.DelFlag this.delFlag;return entity;}}UpInput类 (更新输入对象)////// 客户端信息实体类///[SuppressSniffer, CompilerGenerated]public partial class SysClientUpInput : SysClientCrInput{////// id///[Required(ErrorMessage id不能为空)]public long? id { get; set; }////// 通用的BO对象映射至实体方法。///public override SysClientEntity MapTo(){var entity base.MapTo();entity.Id this.id;return entity;}}4. 实体映射方法生成在不同对象之间进行属性映射是一项常见但繁琐的工作。Mud.EntityCodeGenerator可以自动生成实体与DTO之间的映射方法////// 通用的实体映射至VO对象方法。///public virtual SysClientListOutput MapTo(){var voObj new SysClientListOutput();voObj.id this.Id;voObj.clientKey this.ClientKey;voObj.delFlag this.DelFlag;return voObj;}

相关新闻

循环神经网络的从零开始实现(RNN)

循环神经网络的从零开始实现(RNN)

颜玫度合正常情况下,我们调用方法都是这样写的:$this->methodName()。方法名是写死的,一眼就能看出来。 但动态方法调用不一样,它允许你用变量或表达式来决定调用哪个方法: $methodName doSomething; $this->{$…

2026/7/6 8:03:33 阅读更多 →
没有vCenter怎么使用EXSI克隆虚拟机?

没有vCenter怎么使用EXSI克隆虚拟机?

源彩趴究壳的定义 “壳”的具象理解就类似花生壳,用来保护里面的花生仁。人想吃到里面果实,就需要将其剥掉。 软件也存在这样类似的东西,这种东西我们也称之为“壳”,两者的目标都是一样的,都是用来保护,而…

2026/7/4 19:15:59 阅读更多 →
645645

645645

45645645

2026/5/17 8:32:51 阅读更多 →

最新新闻

深入理解openeuler/xmlpull架构:核心组件与工作原理

深入理解openeuler/xmlpull架构:核心组件与工作原理

深入理解openeuler/xmlpull架构:核心组件与工作原理 【免费下载链接】xmlpull This package provides xml pull parsing API 项目地址: https://gitcode.com/openeuler/xmlpull 前往项目官网免费下载:https://ar.openeuler.org/ar/ openeuler/xm…

2026/7/6 8:21:47 阅读更多 →
Android设备完整性检测实战:Play Integrity API Checker工具使用与集成指南

Android设备完整性检测实战:Play Integrity API Checker工具使用与集成指南

1. 项目概述:为什么我们需要Play Integrity API Checker?在Android应用开发与安全对抗的战场上,我见过太多因为设备环境不可信而导致的“惨案”。一个精心设计的应用内购验证逻辑,可能因为用户设备被Root而形同虚设;一…

2026/7/6 8:21:47 阅读更多 →
3天掌握YOLO目标检测:从环境搭建到实战训练全流程指南

3天掌握YOLO目标检测:从环境搭建到实战训练全流程指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚“3天学透YOLO”到底在说什么 看到“3天学透YOLO全系列”这种标题,第一反应往往是怀疑。YOLO从v1到v13&#…

2026/7/6 8:19:47 阅读更多 →
java017期_java小程序+大后台web商城源码

java017期_java小程序+大后台web商城源码

java小程序大后台web商城源码 基于ssm的一款电子商城,系统采用maven的父子结构, 1、后台web商城包含的模块有: 会员管理、商城配置、编辑商品、订单管理、推广管理、系统管理等大模块, 每个大模块包含至少6个子模块,功…

2026/7/6 8:19:47 阅读更多 →
Windows右键菜单深度解析:从杂乱到有序的工作流重构实践

Windows右键菜单深度解析:从杂乱到有序的工作流重构实践

Windows右键菜单深度解析:从杂乱到有序的工作流重构实践 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 作为Windows用户,你是否经历过这…

2026/7/6 8:17:47 阅读更多 →
SQL集合运算符深度解析:UNION、INTERSECT、EXCEPT原理与避坑指南

SQL集合运算符深度解析:UNION、INTERSECT、EXCEPT原理与避坑指南

1. 为什么我坚持把 SQL 集合运算符讲透——不是为了炫技,而是因为90%的日常数据清洗都卡在这一步 你有没有遇到过这样的场景:老板甩来两份Excel表格,一份是上季度新注册用户,一份是本月完成首单的用户,让你“快速拉个名…

2026/7/6 8:17:47 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻