跟踪我们的进展和即将推出的功能。我们不断发展,以为您提供最佳的开发体验。
该更新将在 Microsoft 官方发布 .NET 10 后,提供对基于 .NET 10 的项目生成的全面支持。
目前,Lino 基于 .NET 9 生成项目,充分利用平台提供的所有功能,包括性能优化、C# 13 的高级特性以及与 ASP.NET Core 的现代集成。
该未来版本的目标是,在 .NET 10 发布时立即提供支持,包括更新的模板、适当的 Target Framework
配置,以及为语言和运行时的新特性准备好的 scaffolding。
支持两个主要级别的自动化测试生成:
单元测试:
为各个类和方法创建测试,重点关注业务逻辑。
集成测试:
创建测试以验证组件之间的集成,模拟与数据库和外部服务的交互。
实现自动生成 .http
文件,以便在开发环境中更方便地测试和记录 REST 接口。
基于权限(PBAC)的访问控制系统,使用 ASP.NET Core 的策略(Policies)。
权限由 Source Generators 自动生成,并在 .NET 中注册为策略。
使用这些权限的每个服务都会触发事件,从而自动更新系统的权限数据库。
主要特点:
_ 通过 Source Generators 自动生成权限
_ 在 ASP.NET Core 中自动注册策略
_ 通过事件/消息系统动态更新权限数据库
_ 支持混合 RBAC,将角色的简便性与权限的粒度结合
优势:
_ 极致性能与可扩展性
_ 自动化管理,简化维护
_ 适用于不同的安全场景
在使用 Minimal APIs 创建的端点中实现对 IFormFile
类型的原生支持。此功能将实现带有文件上传功能的路由自动生成,包括:
_ 支持通过 multipart/form-data
上传的端点定义;
_ 对 MIME 类型和最大文件大小的自动验证;
_ 支持本地存储,并可集成 Azure Blob Storage 和 AWS S3 等云服务;
非常适用于需要安全且高效文件上传的应用程序,例如图片、文档和各类媒体。
从此版本起,Lino CLI 将执行生成文件的智能自动合并。
之前,Lino 创建的文件会直接替换现有文件,可能会覆盖开发者手动修改的内容。
现在,采用新的三方合并(3-way merge)策略(原始生成文件、用户编辑版本和新生成文件),Lino 能够保留个性化定制,同时应用模板的结构性更新。
该方法的优点:
_ 避免手动代码的意外覆盖。
_ 促进基于模板项目的持续演进。
_ 减少更新过程中的手动冲突。
_ 改善本地定制与框架演进的集成。
现在,通过 Lino CLI 生成的项目可以使用基于 Source Generators 的 Tolitech.Presentation.API.Generators 库自动注册 Minimal APIs。
这种方式替代了以下操作:
_ 使用 MapGet
、MapPost
等手动注册每个端点
_ 使用 Reflection 扫描和映射路由——这在性能上代价较高
通过使用 Source Generators,路由映射在编译时完成,生成优化、清晰且可追踪的代码。
主要优势:
_ 消除手动注册路由时的冗长和重复
_ 移除 Reflection 的使用,降低 CPU 和内存消耗
_ 改善代码结构与职责分离
_ 编译时验证,生成安全的自动路由
_ 有利于项目的维护和可扩展性
我们现在使用 Tolitech.DependencyInjection.Generators 库,它取代了 Tolitech.DependencyInjection.Extensions 中基于 Reflection 的方法。
该新库利用 .NET 的 Source Generators 功能,在编译时自动生成依赖注册代码。
这带来了多种优势:
_ 消除运行时的 Reflection,提高应用性能。
_ 更加可预测和可追踪的代码生成。
_ 更安全的编译,提前发现错误。
_ 与 .NET 的构建流水线原生集成。
我们开始使用 Central Package Manager(CPM),这是一种在具有多个项目的解决方案中管理 NuGet 包的现代方法。
借助它,所有包的版本都集中定义在 Directory.Packages.props
文件中,消除了不一致性,并简化了安全且协调的更新流程。
这减少了因项目间版本差异而引发的错误,提高了可追踪性,并简化了大规模依赖项更新的流程。
Lino 现在生成的新解决方案格式为 .slnx
,这是传统 .sln
的现代演进。
基于 XML,.slnx
被采纳是因为它对人类和工具都更具可读性,降低了与外部系统和 CI/CD 流水线集成的复杂性。
此外,它更清晰的结构显著改善了版本控制——更改变得更可预测且更易于审查。
这一变化与 .NET 生态系统的未来方向保持一致,促进了项目开发中的更强互操作性、可扩展性和自动化。
Community 订阅现在支持基于 .NET 9 和 Aspire 9.2.1 的项目生成,允许用户免费并且技术性地探索平台的功能。
此版本包括:
_ 使用自动化 scaffolding 创建服务和实体;
_ 选择数据库并进行完整的初始配置;
_ 直到 EF Core Migrations
阶段的功能生成。
尽管像微服务和模块化单体等高级功能仅限于付费计划,但此版本为评估生成的架构、代码质量和与现代 .NET 生态系统的集成提供了坚实的基础。
CLI 现提供命令 lino database migrations add
,以便于为项目中的任何服务或模块创建迁移。
此功能自动生成与构建版本相关联的迁移脚本,并允许一致地记录更改。
主要优势:
_ 通过简单直接的命令快速为服务或模块创建迁移。
_ 自动生成与项目版本控制兼容的 .sql
脚本。
_ 即使在分布式架构中,也便于数据库版本控制。
_ 以安全且可审计的方式标准化并记录数据库结构更改。
_ 与应用程序的构建和部署流程自然集成。
新的版本管理功能支持列出已有版本,并为由工具生成的服务和 Web 应用执行版本号的提升(bump),遵循 SemVer(语义化版本控制)规范。这增强了发布流程的可追溯性、标准化和控制力。
通过 version
命令,可以轻松设置和更新每个服务或应用的版本号,便于审计并将最佳实践融入开发流程中。build
命令也已优化,可生成带有指定版本标签的 Docker 镜像,从而简化打包流程,并为发布做好准备。
这些改进提升了版本管理的一致性和可预测性,为开发和运维团队带来更高的透明度。
自定义在生成 Command(Post、Put、Patch)和 Query(Get)类型的构件时将考虑哪些属性。
此功能提供:
_ 在实体 scaffolding 过程中使用 CLI 交互式界面选择属性;
_ 自动生成仅包含选定字段的 input/output 对象;
_ 完全支持在 REST API 中自定义 payload,提高对传输数据的灵活性与控制力;
_ 与验证逻辑和生成的数据契约集成,遵循必要性和一致性规则。
此改进旨在提供更高粒度的构件建模,允许开发者精准控制通过 CLI 生成架构所暴露、持久化或查询的内容。
已在 Lino CLI 中实现了自动的文件版本控制和备份机制,旨在确保在文件生成和覆盖过程中实现安全性和可追溯性。
所有生成的文件都会保存在 /.lino/files/.../received/
文件夹中,确保每个文件都按时间顺序组织,并且便于查找。
被替换的文件将保留在 /.lino/files/.../replaced/
文件夹中,便于在需要时恢复到之前的版本。该备份结构提供了更高的控制性和安全性,尤其适用于协作和自动化开发环境中对生成文件的全面审计。
为前端和后端项目完整实现基于 JWT(JSON Web Tokens) 的身份验证和授权,并通过 ASP.NET Core 自定义的 Authorization Policies
实现细粒度权限控制。
重点内容:
_ 使用 JWT 的安全登录和验证。
_ 基于自定义策略(Claims 和 Roles)的授权。
_ 自动集成生成的 API 和前端(Blazor)。
_ 基于用户权限保护路由和组件。
优势:
_ 为现代应用提供强大的安全保障。
_ 按配置文件和域标准化访问模型。
_ 应用层间的安全集成体验。
_ 易于根据企业场景进行扩展或调整。
现在可以向生成的项目中添加一个或多个前端,初步支持Blazor Web Apps
— 包括 Server 和 WebAssembly 模型。
这些前端会自动与工具生成的 API 集成,允许创建完整的 CRUD 页面,直接调用后端端点并持久化到数据库。
亮点:
_ 基于领域实体生成 UI。
_ 与生成的 API 原生通信。
_ 端到端功能:前端、后端和数据库协同工作。
_ 同一项目中支持多个前端(例如:管理、门户、公共)。
优势:
_ 界面开发更快捷。
_ 减少返工和手动集成。
_ 统一的导航、样式和数据访问标准。
_ 自动生成 CRUD 页面,提高生产力。
我们实现了Transactional Outbox模式,以确保集成事件发送的可靠性。
应用程序事务期间不直接发布事件,而是在同一数据库事务内注册到特定表中。
随后,background job读取该 outbox 并执行事件的实际触发。
此方法的优势:
_ 保证数据库变更与事件发布的一致性。
_ 避免中间故障导致消息丢失。
_ 允许控制已发布事件的重发和审计。
_ 符合事件驱动架构和微服务的最佳实践。
已添加选项,可在生成的服务中包含Background Jobs —— 无论是简单还是模块化服务 —— 使用 Hangfire
库实现。
由此,项目原生支持后台任务的调度和执行,包括:
_ 定时(cron)、计划或立即执行。
_ 通过集成控制面板进行监控。
_ 安全地持久化和重新处理任务。
该机制还可与 Transactional Outbox Pattern 结合使用,即使在部分故障或分布式场景下,也能可靠地触发集成事件。
主要优势:
_ 自动化重复且耗时的任务,不阻塞主流程。
_ 高可靠性和后台任务的持久性。
_ 可与 Outbox 模式快速集成,确保事件可靠性。
_ 可轻松为每个服务配置和自定义任务。
_ 内置仪表板用于查看和控制执行情况。
新增了使用 MassTransit
的抽象和高级功能配置 异步消息传递 支持 RabbitMQ
的功能。
这样,生成的服务可以通过分布式事件和命令进行解耦且具弹性的通信。
集成亮点:
_ 使用 RabbitMQ 的自动传输配置。
_ 通过 MassTransit 和原生依赖注入发布和监听事件。
_ 兼容 Transactional Outbox 模式以提高可靠性。
优势:
_ 基于事件的通信实现高扩展性。
_ 生产者和消费者解耦。
_ 更高的容错能力和自动重处理。
_ 异步业务流程的维护和扩展更加简便。
已实现了一个强大的 Unit of Work(工作单元)机制,具备完整的事务控制、领域事件管理、集成事件发布(采用 Outbox 模式)、自动回滚,以及基于操作成功或失败的 Result
模式支持提交或回滚。
亮点:
_ 支持显式创建事务,并可控制隔离级别。
_ 与数据持久化同步发布 领域事件(Domain Events)。
_ 通过 Outbox 模式解耦发布 集成事件(Integration Events)。
_ 支持约束验证的异常处理和自动回滚机制。
_ 根据操作 Result
结果决定是否提交。
_ 提供结构化日志记录:包括事件、事务与失败情况。
优势:
_ 保证数据库写入操作与事件发布之间的事务一致性。
_ 灵活支持使用标准 SaveChanges 或完全掌控处理流程。
_ 有助于进行单元测试及故障追踪。
_ 明确划分领域逻辑与基础设施,实现对 MediatR 的支持。
现在可以为每个生成的服务单独定义所使用的数据库 —— 原生支持 SQL Server 和 PostgreSQL。
这种方法允许每个服务拥有专属数据库,确保完全隔离,有助于实施真实微服务架构的最佳实践。
对于 模块化服务,应用程序仍然为每个服务使用一个数据库,并通过 schema
将各模块分离,从而保持良好的组织和内聚性。
主要优势:
_ 服务间数据隔离,提高安全性和职责明确性。
_ 可逐步采用具有独立数据库的微服务架构。
_ 模块化服务中的 schema 分离便于维护和理解业务领域。
_ 每个服务可灵活选择最合适的数据库系统。
_ 便于测试、独立部署和横向扩展。
Lino CLI 现在允许开发人员在生成项目时选择创建 简单服务(传统方式)或 模块化服务,并且可以根据解决方案的需要自由组合两者。
这种方法直接支持不同的架构风格:
简单服务:非常适合构建基于微服务的解决方案,或以直接和隔离的方式构建传统的单体应用程序。
模块化服务:将应用程序域组织为 Bounded Contexts,便于采用具有职责清晰分离和组件更好内聚性的 模块化单体。
您可以根据应用场景,添加任意数量的服务 — 简单服务、模块化服务或两者结合。
此方法的优点:
_ 在架构建模方面拥有更高灵活性。
_ 可轻松实现从单体到微服务的渐进式扩展。
_ 按领域或上下文清晰划分职责。
_ 更好的代码组织和与现代架构最佳实践的一致性。
_ 降低耦合度,提高可维护性。
您可以使用微服务进行开发,或者采用模块化单体架构 — 选择最适合您应用程序的理想路径。
已添加对使用 Microsoft.Extensions.Caching.Hybrid
库的混合缓存的原生支持。
该实现结合了内存缓存(MemoryCache)和分布式缓存(DistributedCache),提供两种方式的优势。
此方法可在处理频繁请求时提供极快的响应速度,同时在分布式环境中保持同步性和可扩展性。
混合策略的优势:
_ 从本地内存中即时读取,提供高性能。
_ 通过分布式缓存在实例之间实现数据持久化和共享。
_ 减少对数据库和外部 API 的请求。
_ 在具有多个副本的应用中实现更好的水平扩展性。
_ 在两个缓存层之间进行智能同步。
非常适用于既要求性能和一致性,又不牺牲架构灵活性的场景。
Lino CLI 现在生成具有多语言集成支持的项目,包括针对以下文化的自动翻译:
en
, pt-BR
, es
, fr
, it
, de
, ja
, ko
, zh-Hans
和 ru
。
资源文件(resx)根据主语言自动生成,内容自动翻译,准备好立即在全球应用中使用。
多语言支持的优点:
_ 方便创建面向不同地区和文化的应用。
_ 缩短国际化所需时间。
_ 与 .NET 本地化系统的原生集成。
_ 改善多语言应用中的最终用户体验。
_ 允许快速扩展面向全球市场的解决方案。
Lino CLI 生成的代码现在使用LoggerMessage,以更高效且性能更优的方式记录日志。
与传统的ILogger
扩展方法相比,后者会产生值类型的装箱(boxing)并影响运行时内存分配,LoggerMessage模式为每条日志消息创建了强类型且静态的Actions
。
该方法的优点:
_ 显著减少内存分配。
_ 避免了对诸如int
、Guid
、DateTime
等值类型的装箱
。
_ 在高日志量场景中提供更好的性能。
_ 日志消息的标准化和集中管理。
_ 提升审计、诊断和监控的清晰度。
此改进在性能和可追踪性至关重要的API和后端服务中尤为重要。
Lino CLI 现在提供对 Strongly Typed Ids 的可选支持,允许使用强类型的特定类型来表示实体标识符,而不是使用通用类型如 Guid
或 int
。
该功能有助于避免常见错误,例如错误地将一个实体的标识符分配给另一个实体,并使代码更具表现力,更贴合应用的领域模型。
使用 Strongly Typed Ids 的优势:
_ 编译时更高的类型安全性。
_ 防止在不同实体之间意外赋值。
_ 提高代码的可读性和意图表达。
_ 更易于在领域中跟踪和调试标识符。
_ 与 EF Core、JSON 序列化和验证集成。
该功能是可选的,可在生成项目时启用。
生成的项目现在可以配置为支持静态代码分析,使用.NET生态系统的主要分析器。
这些工具直接集成到构建过程中,帮助识别格式、样式、架构问题以及开发早期的潜在逻辑错误。
优势:
_ 从一开始促进代码的一致性和标准化。
_ 及早发现错误和不良实践。
_ 促进代码审查和技术入职。
_ 提高代码库的质量和可维护性。
_ 避免常见错误,提升对.NET最佳实践的遵循。
配置可以按项目自定义,允许在所需的严格程度上有更大的灵活性。
创建了Tolitech.Results库,完整且流畅地实现了.NET中的Result Pattern。
该库将操作结果(无论成功还是失败)封装为结构化对象,包含HTTP状态、消息、错误、标题、详细信息和可选数据(支持Result<T>
)。
使用Result Pattern的好处:
_ 在整个应用程序中标准化操作返回。
_ 减少作为流程控制的异常。
_ 便于操作的组合和链式调用。
_ 更好地支持层与服务之间的通信。
_ 与HTTP API、验证和错误消息的流畅集成。
_ 更好的调试体验和结构化日志记录。
此外,扩展如Tolitech.Results.Http和Tolitech.Results.Guards扩展了与REST API和防御性验证的集成。