Zooper.Tortoise.Generators.Attributes
1.0.2
dotnet add package Zooper.Tortoise.Generators.Attributes --version 1.0.2
NuGet\Install-Package Zooper.Tortoise.Generators.Attributes -Version 1.0.2
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="Zooper.Tortoise.Generators.Attributes" Version="1.0.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Zooper.Tortoise.Generators.Attributes" Version="1.0.2" />
<PackageReference Include="Zooper.Tortoise.Generators.Attributes" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Zooper.Tortoise.Generators.Attributes --version 1.0.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Zooper.Tortoise.Generators.Attributes, 1.0.2"
#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.
#addin nuget:?package=Zooper.Tortoise.Generators.Attributes&version=1.0.2
#tool nuget:?package=Zooper.Tortoise.Generators.Attributes&version=1.0.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Zooper.Tortoise
<img src="icon.png" alt="Zooper.Tortoise" width="256" />
Zooper.Tortoise is a .NET library that simplifies the implementation of the "Strong Type" pattern (also known as "Strongly Typed IDs" or "Primitive Obsession" solution) in C# applications.
What is the Strong Type Pattern?
The Strong Type pattern helps you avoid "Primitive Obsession" by wrapping primitive types in domain-specific types, improving:
- Type Safety: Prevent mixing different IDs/values that share the same primitive type
- Self-Documentation: Clear identification of what a value represents
- Encapsulation: Add domain-specific behavior to primitive values
- Validation: Ensure values meet domain requirements
Features
- Provides base classes and interfaces to easily create strong types
- Supports both class and record implementations
- Automatic generation of converters through source generators:
- Entity Framework Core Value Converters (only generated if Microsoft.EntityFrameworkCore is referenced)
- JSON Converters (Newtonsoft.Json)
- Type Converters
Installation
dotnet add package Zooper.Tortoise
Usage
Creating a Strong Type Record
using System;
using Zooper.Tortoise.Generators.Attributes.Attributes;
using Zooper.Tortoise.Interfaces;
namespace YourNamespace;
[GenerateConverters]
public partial record UserId(Guid Value) : StrongTypeRecord<Guid, UserId>(Value)
{
// The source generator will implement these partial classes
public partial class UserIdValueConverter;
public partial class UserIdNewtonsoftJsonConverter;
public partial class UserIdTypeConverter;
}
Creating a Strong Type Class
using System;
using Zooper.Tortoise.Generators.Attributes.Attributes;
using Zooper.Tortoise.Interfaces;
namespace YourNamespace;
[GenerateConverters]
public partial class OrderId : StrongTypeClass<int, OrderId>
{
public OrderId(int value) : base(value)
{
}
// The source generator will implement these partial classes
public partial class OrderIdValueConverter;
public partial class OrderIdNewtonsoftJsonConverter;
public partial class OrderIdTypeConverter;
}
Using Strong Types with Entity Framework Core
public class User
{
public UserId Id { get; set; }
// Other properties...
}
public class YourDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Configure value converter for UserId
modelBuilder.Entity<User>()
.Property(e => e.Id)
.HasConversion(new UserId.UserIdValueConverter());
}
}
Using Strong Types with JSON Serialization
// Add the converter to your serializer settings
var settings = new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new UserId.UserIdNewtonsoftJsonConverter()
}
};
// Serialize and deserialize with proper conversion
var user = new User { Id = new UserId(Guid.NewGuid()) };
var json = JsonConvert.SerializeObject(user, settings);
var deserializedUser = JsonConvert.DeserializeObject<User>(json, settings);
Benefits of Using Zooper.Tortoise
- Reduced Boilerplate: Base classes handle equality comparison, ToString(), etc.
- Type Safety: Compiler prevents passing the wrong ID type
- Automatic Conversion: Generated converters handle serialization seamlessly
- Clean API: Strongly typed interfaces improve API design
License
This project is licensed under the MIT License - see the LICENSE file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Newtonsoft.Json (>= 12.0.2)
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 |
---|---|---|
1.0.2 | 224 | 4/16/2025 |