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" />
                    
Directory.Packages.props
<PackageReference Include="Zooper.Tortoise.Generators.Attributes" />
                    
Project file
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
                    
#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
                    
Install Zooper.Tortoise.Generators.Attributes as a Cake Addin
#tool nuget:?package=Zooper.Tortoise.Generators.Attributes&version=1.0.2
                    
Install Zooper.Tortoise.Generators.Attributes as a Cake Tool

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 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.

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