Value Object : You shouldn't have multiple parameterized constructors
DDD
If you have different behaviours with default values or nullable values : You should have differents Value Object.
If you have different constructors but all constructors call the same constructor, you should use defaults parameters.
Value objects classes are annotated with ValueObject
.
Examples
Example 1:
Positive
Correct implementation following the practice.
namespace Practices.DDD.ValueObject.ParametrizedConstructor
{
[ValueObject]
internal class VOSimpleValueConstructor
{
public VOSimpleValueConstructor(int myValue)
{
MyValue = myValue;
}
public int MyValue { get; }
}
[ValueObject]
internal class VOTwoValues
{
public VOTwoValues(int myValue, int secondValue)
{
MyValue = myValue;
SecondValue = secondValue;
}
public int MyValue { get; }
public int SecondValue { get; }
}
}
Negative
Incorrect implementation that violates the practice.
namespace Practices.DDD.ValueObject.ParametrizedConstructor
{
[ValueObject]
internal class VOSimpleValueConstructor
{
public VOSimpleValueConstructor(int myValue)
{
MyValue = myValue;
}
public int MyValue { get; }
}
[ValueObject]
internal class VOTwoValues
{
public VOTwoValues(int myValue, int secondValue)
{
MyValue = myValue;
SecondValue = secondValue;
}
public int MyValue { get; }
public int SecondValue { get; }
}
[ValueObject]
internal class VOMultipleConstructor
{
public VOMultipleConstructor(int myValue)
{
MyValue = myValue;
}
public VOMultipleConstructor(int myValue, int secondValue)
{
MyValue = myValue;
SecondValue = secondValue;
}
public int MyValue { get; }
public int SecondValue { get; }
}
}
Example 2:
Positive
Correct implementation following the practice.
namespace Practices.DDD.ValueObject.ParametrizedConstructor
{
[ValueObject]
internal class VOSimpleValueConstructor
{
public VOSimpleValueConstructor(int myValue)
{
MyValue = myValue;
}
public int MyValue { get; }
}
[ValueObject]
internal class VOTwoValues
{
public VOTwoValues(int myValue, int secondValue)
{
MyValue = myValue;
SecondValue = secondValue;
}
public int MyValue { get; }
public int SecondValue { get; }
}
}