2011-05-23 33 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