2011-05-23 32 views
0

我想要決定如何處理通過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中填充基類開始時,我對結束使用接口裝飾的派生類的最佳方式感到困惑。我拿出想法設法處理這個是:

  1. 裝飾CarFromDB與ICAR,並嘗試拿出來實施其內部或致電給其他類廣泛PassesEmissionStandards方法的清潔方法幫助
  2. 使用AutoMapper或等效的+工廠將我的基類對象轉換爲派生類對象
  3. 由於可以從基類中的屬性識別派生類類型,因此可以爲我的NHibernate派生類找到一些鉤入NHibernate的方式來指導它映射派生類的使用。

我覺得這個問題一定是一個非常普遍的問題,但我在SO和其他地方搜索沒有找到任何可靠的指導方針。請注意:我對ORM和領域建模比較陌生,對NHibernate來說也很新穎。任何幫助表示讚賞。

回答

0

我不認爲我明白你的問題,你爲什麼不容使用:

public interface ICar 
{ 
    public bool PassesEmisionStandards(string state); 
    public int Horsepower { get; set; } 
    public string Model { get; set; } 
} 

public abstract class CarBase : ICar 
{ 
    public int Horsepower { get; set; } 
    public string Model { get; set; } 
    public abstract bool PassesEmisionStandards(string state); 
} 

或者,如果CarBase用於所有派生類也一樣,你可能需要使用策略模式

public interface IEmissionCalculator 
{ 
    void Calculate(IEmissionCalculatorContext context); 
} 

public CarBase : ICar 
{ 
    internal void Assign(IEmissionCalculator calculator){} 

    public bool PassesEmisionStandards(string state) 
    { 
     //assign all info needed for calculations 
     var ctx = new IEmissionCalculatorContext { }; 
     return _calculator.Check(ctx); 
    } 
} 

您可以使用相同的DB級,但根據汽車類型分配不同的排放量。

如果這樣也行不通,我會使用automapper。

+0

在第一個例子中,您是否還需要從ORM創建並填充的基類汽車實例中實例化派生汽車的實例?第二個例子很有趣,因爲它抽象了派生類和基類之間的唯一區別。然後,我可以通過一個可以分配正確計算器的函數來運行(基類)汽車的集合。 – akabak 2011-05-23 21:36:01

+0

1.是的。然而,你可以用nhibernate映射每個子類。是的。 – jgauffin 2011-05-24 14:29:49