Let's say I have the following C# class that I want to be immutable. You can only set it by using the parametrized constructor.
public class InsulineInjection
{
    private InsulineInjection()
    {
        // We don't want to enable a default constructor.
    }
    public InsulineInjection(Millilitre millilitre, DateTime dateTime, string remark)
    {
        this.Remark = remark;
        this.DateTime = dateTime;
        this.Millilitre = millilitre;
    }
    public string Remark { get; private set; }
    public DateTime DateTime { get; private set; }
    public Millilitre Millilitre { get; private set; }
}
Now I would like to use an ORM to create this POCO. However, as far as I can see all .NET ORM's expects properties to be accessible and have a public constructor to be able to create this POCO. So I would have to change my POCO into this:
public class InsulineInjection
{
    public InsulineInjection()
    {
    }
    public InsulineInjection(Millilitre millilitre, DateTime dateTime, string remark)
    {
        this.Remark = remark;
        this.DateTime = dateTime;
        this.Millilitre = millilitre;
    }
    public string Remark { get; set; }
    public DateTime DateTime { get; set; }
    public Millilitre Millilitre { get; set; }
}
This however makes my POCO mutable again. Someone using it could simply change any property afterwards which is not wat I want.
As far as I can see it, I could solve this in two different ways:
I'm leaning towards solution 2. Does someone have an example on how to do this? Or does someone have a better solution than the ones I describe above?
Many OR/Ms work as long as there is a default constructor and setters (no matter if they are public or not, they just have to exist)
So this wont work (no default constructor):
public class InsulineInjection
{
    public InsulineInjection(Millilitre millilitre, DateTime dateTime, string remark)
    {
        this.Remark = remark;
        this.DateTime = dateTime;
        _millilitre = millilitre;
    }
    public string Remark { get; set; }
    public DateTime DateTime { get; set; }
    public Millilitre Millilitre { get { return _millilitre; } }
}
or this (no setter for the last property)
public class InsulineInjection
{
    public InsulineInjection(Millilitre millilitre, DateTime dateTime, string remark)
    {
        this.Remark = remark;
        this.DateTime = dateTime;
        _millilitre = millilitre;
    }
    public string Remark { get; set; }
    public DateTime DateTime { get; set; }
    public Millilitre Millilitre { get { return _millilitre; } }
}
While this will work:
public class InsulineInjection
{
    protected InsulineInjection()
    {
        // works with many OR/Ms
    }
    public InsulineInjection(Millilitre millilitre, DateTime dateTime, string remark)
    {
        this.Remark = remark;
        this.DateTime = dateTime;
        this.Millilitre = millilitre;
    }
    public string Remark { get; private set; }
    public DateTime DateTime { get; private set; }
    public Millilitre Millilitre { get; private set; }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With