我想要決定如何處理通過ORM(在這種情況下,NHibernate)填充對象的域級別的類和接口。我嘲笑了一個非常簡單的場景,這有助於說明我目前的狀況。ORM與實體類和域接口/類
public interface ICar
{
public bool PassesEmisionStandards(string state);
public int Horsepower { get; set; }
public string Model { get; set; }
}
public class CarFromDB
{
public int Horsepower { get; set; }
public string Model { get; set; }
}
public class ModelT : CarFromDB, ICar
{
public bool PassesEmissionStandards(string state)
{
return false;
}
public override string ToString()
{
return Model + " with " + Horsepower + " ponies";
}
}
在這種情況下,CarFromDB是通過NHibernate映射到我的數據庫的類。 ICar是我的用戶界面/控制器代碼正在處理的界面。 ModelT是將實例傳遞給UI的類之一。
在我的實際域中,PassesEmissionStandards是一個複雜的方法,它在不同的派生類中有很大的不同,而且CarFromDB類有十幾個簡單的屬性以及對其他類的引用,包括單獨和列表。這些信息全部用於PassesEmissionStandards等價物中。
當我從ORM中填充基類開始時,我對結束使用接口裝飾的派生類的最佳方式感到困惑。我拿出想法設法處理這個是:
- 裝飾CarFromDB與ICAR,並嘗試拿出來實施其內部或致電給其他類廣泛PassesEmissionStandards方法的清潔方法幫助
- 使用AutoMapper或等效的+工廠將我的基類對象轉換爲派生類對象
- 由於可以從基類中的屬性識別派生類類型,因此可以爲我的NHibernate派生類找到一些鉤入NHibernate的方式來指導它映射派生類的使用。
我覺得這個問題一定是一個非常普遍的問題,但我在SO和其他地方搜索沒有找到任何可靠的指導方針。請注意:我對ORM和領域建模比較陌生,對NHibernate來說也很新穎。任何幫助表示讚賞。
在第一個例子中,您是否還需要從ORM創建並填充的基類汽車實例中實例化派生汽車的實例?第二個例子很有趣,因爲它抽象了派生類和基類之間的唯一區別。然後,我可以通過一個可以分配正確計算器的函數來運行(基類)汽車的集合。 – akabak 2011-05-23 21:36:01
1.是的。然而,你可以用nhibernate映射每個子類。是的。 – jgauffin 2011-05-24 14:29:49