比方說,我有以下C#類,我想成爲不可變的。您只能通過使用參數化的構造函數來設置它。POCO's,ORM和不變性。如何讓他們一起工作?
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; }
}
現在我想用一個ORM來創建這個POCO。但是,據我所見,所有.NET ORM的期望屬性都是可訪問的,並且有一個公共構造函數可以創建此POCO。所以我不得不改變我的POCO這個:
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; }
}
然而,這使我的POCO又易變。有人使用它可以簡單地改變任何屬性後,這是不是我想要的。
至於我能看到它,我可以以兩種不同的方式解決這個問題:
- 寫我自己的數據訪問層(或修改ORM),以便能夠使用構造函數創建正確的POCO實例我創建。
- 創建某種映射器。讓ORM創建簡單的DTO對象,並使用映射器在合適的時間將DTO對象轉換爲我的POCO。
我傾向於解決方案2.有人有如何做到這一點的例子嗎?還是有人比我上面描述的更好的解決方案?
#2聽起來很可能。像automapper這樣的組件可以派上用場。什麼客戶/你的應用程序層需要你的類型是不可變的? –
爲什麼你想要你的數據庫對象是不可變的?查詢會很好,但是如何計劃更新數據庫中的值?我和下一個人一樣對不可改變的類型有很大的喜愛,但是這對於一個可變類型來說似乎是一個合適的地方。 – Servy
此代碼僅僅是一個小型業餘愛好項目的例子。它應該表示您可以添加新的注射劑。但是,一旦添加它就不能再進行修改。 當然,我可以在UI中對它進行編碼,但是如果POCO中表示此功能,我發現它會更加透徹。 – Sardaukar