我想要决定如何处理通过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