From d744d0c3e7451936df0e3730f1c00cee78ea1322 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 15 Apr 2026 16:28:13 -0300 Subject: [PATCH] Update Guid-backed ID factory to use CreateVersion7 on .NET 9+ The source generator now emits New() for Guid-backed IDs that uses Guid.CreateVersion7() on .NET 9+ and falls back to Guid.NewGuid() on earlier versions. Updated docs and implementation in NewableGuid.cs to match this logic. --- src/SKILL.md | 5 +++-- src/StructId/Templates/NewableGuid.cs | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/SKILL.md b/src/SKILL.md index 1398a19..ea452d2 100644 --- a/src/SKILL.md +++ b/src/SKILL.md @@ -100,13 +100,14 @@ For every struct ID, the source generator emits: - Implicit/explicit conversion operators to/from `TValue` - `INewable` / `INewable` implementation - `New(TValue value)` static factory method -- `New()` (parameterless) for `Guid`- and `Ulid`-backed IDs, using `Guid.NewGuid()` / `Ulid.NewUlid()` +- `New()` (parameterless) for `Guid`- and `Ulid`-backed IDs, using `Guid.CreateVersion7()` on .NET 9+ or `Guid.NewGuid()` on earlier targets / `Ulid.NewUlid()` ## Factory Methods ```csharp // Guid-backed: parameterless New() generates a new GUID -var userId = UserId.New(); // new UserId(Guid.NewGuid()) +// On .NET 9+, uses Guid.CreateVersion7(); earlier targets use Guid.NewGuid() +var userId = UserId.New(); // new UserId(Guid.CreateVersion7()) on .NET 9+ var userId2 = UserId.New(someGuid); // new UserId(someGuid) // Ulid-backed: parameterless New() generates a new ULID diff --git a/src/StructId/Templates/NewableGuid.cs b/src/StructId/Templates/NewableGuid.cs index 2adcdc7..72fb198 100644 --- a/src/StructId/Templates/NewableGuid.cs +++ b/src/StructId/Templates/NewableGuid.cs @@ -6,8 +6,13 @@ [TStructId] file partial record struct TSelf(Guid Value) { - /// - /// Creates a new instance of with a . - /// - public static TSelf New() => new(Guid.NewGuid()); + /// Creates a new instance with a newly generated . + public static TSelf New() + { +#if NET9_0_OR_GREATER + return new(Guid.CreateVersion7()); +#else + return new(Guid.NewGuid()); +#endif + } } \ No newline at end of file