ImmutableEntityHelper 0.1.0

dotnet add package ImmutableEntityHelper --version 0.1.0
NuGet\Install-Package ImmutableEntityHelper -Version 0.1.0
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="ImmutableEntityHelper" Version="0.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ImmutableEntityHelper --version 0.1.0
#r "nuget: ImmutableEntityHelper, 0.1.0"
#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.
// Install ImmutableEntityHelper as a Cake Addin
#addin nuget:?package=ImmutableEntityHelper&version=0.1.0

// Install ImmutableEntityHelper as a Cake Tool
#tool nuget:?package=ImmutableEntityHelper&version=0.1.0

ImmutableEntityHelper

A library to create and maniputate immutable objects.

The composition method allows you to use existing mutable classes as immutable classes, safe to use. They are also easy to clone and "modify" using this library.

The inheritance method allows you to create flexible fluent interfaces with far less mess.

Example for the Inheritance Method

If a field is intended to be modified then a new instance of the object is returned with the assigned field value.

This allows the developer to create fluent interfaces with safe immutable entities.

// The immutable Person class extends ImmutableEntity<Person>
// class and provides the SetName a SetAge methods,
// which return new instances of Person, as invoked.
var person1 = new Person();

var person2 = person1
	.SetName("Joseph")
	.SetAge(26);

// In this case,
// person1 and person2 are totally
// different instances !!!

// person2 came by copying person1
// and "modifying" the Name and Age fields
// using those methods.

Following the previous example, the class Person extends our class ImmutableEntity<T> and provides the SetName and SetAge methods in a fluent interface. These methods returns new immutable instances of the Person class, as used.

class Person : ImmutableEntity<Person>
{
	// Read only properties!
	public string Name { get; }
	public int Age { get; }

	public Person SetName(string name)
	{
		// These fluent interface methods
		// use the SetField method from ImmutableEntity<T>
		// to create and return new immutable instances.
		return SetField((x) => x.Name, name);
	}

	public Person SetAge(int age)
	{
		return SetField((x) => x.Age, age);
	}
}

Example using the Composition Method

Some entities cannot extend ImmutableEntity<T>, so this class can also be instantiated and consumed as an instance in another class.

In this example, we decorate the Student class in the class ImmutableStudent by adding some fluent methods like SetName or SetAge, which return a new class of the the immutable class.

class ImmutableStudent : Student, IStudent
{
	private ImmutableEntity<ImmutableStudent> _immutableEntity;

	public ImmutableStudent()
	{
		_immutableEntity = new ImmutableEntity<ImmutableStudent>(this);
	}

	public ImmutableStudent SetName(string name)
	{
		return _immutableEntity.SetField((x) => x.Name, name);
	}

	public ImmutableStudent SetAge(int age)
	{
		return _immutableEntity.SetField((x) => x.Age, age);
	}
}

To use the previous, just instantiate the ImmutableStudent class and use its instantiation methods for immutable entities. You can also cast ImmutableStudent to Student, if required.

This method allows the developer to use mutable classes as immutable objects, preventing side effects.

var person1 = new ImmutableStudent();

var person2 = person1
	.SetName("Joseph")
	.SetAge(26);

// Different immutable instances,
// but as easy to manipulate
// as strings, which are also immutable.
person1.Should().NotBe(person2);
person2.Name.Should().Be("Joseph");
person2.Age.Should().Be(26);

The class used for this example is:

class Student : IStudent
{
	public string Name { get; }
	public int Age { get; }
}
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. 
.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

    • No dependencies.

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
0.1.0 698 10/26/2018

Initial version.