nhibernate和DDD的建议

时间:2009-04-21 12:41:47

标签: nhibernate domain-driven-design

我是nHibernate和DDD的新手,所以请耐心等待。

我需要从我的SQL表创建一个新报告。该报告是只读的,将绑定到ASP.NET应用程序中的GridView控件。

该报告包含以下字段样式,颜色,大小,LAQty,MTLQty,状态。

我有Style,Color和Size的实体,我在其他asp.net页面中使用。我通过存储库使用它们。我不确定是否应该为我的报告使用相同的实体。如果我使用它们,我应该在哪里映射数量和状态字段?

如果我不应该使用相同的实体,我应该为报告创建一个新类吗?

如上所述,我是新手,只是想学习和正确编码。

谢谢

2 个答案:

答案 0 :(得分:4)

对于报告,通常更容易使用普通值或特殊DTO。当然,您可以查询引用所有信息的实体,但要将其放入列表中(例如,使用数据绑定),只需一个包含所有值的单个类就可以了。

为了获得更具体的解决方案,您需要告诉我们一些您的域模型。班级模型如何?

通常,您至少有三个选项可以使用NHibernate从数据库中获取“普通”值。

编写返回值数组的HQL

例如:

select e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty 
from entity1 inner join entity2
where (some condition)

结果将是object []的列表。列表中的每个项目都是一行,对象[]中的每个项目都是一列。这非常类似于sql,但是在更高级别(您在实体级别上描述查询)并且与数据库无关。

或者您只创建一个DTO(数据传输对象)来保存结果的一行:

select new ReportDto(e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty)
from entity1 inner join entity2
where (some condition)

ReportDto需要实现一个包含所有这些参数的构造函数。结果是ReportDto列表。

或者您使用CriteriaAPI(推荐)

session.CreateCriteria(typeof(Entity1), "e1")
  .CreateCriteria(typeof(Entity2), "e2")
  .Add( /* some condition */ )
  .Add(Projections.Property("e1.Style", "Style"))
  .Add(Projections.Property("e1.Color", "Color"))
  .Add(Projections.Property("e1.Size", "Size"))
  .Add(Projections.Property("e2.LAQty", "LAQty"))
  .Add(Projections.Property("e2.MTLQty", "MTLQty"))
  .SetResultTransformer(AliasToBean(typeof(ReportDto)))
  .List<ReportDto>();

ReportDto需要具有每个别名“Style”,“Color”等的名称。输出是ReportDto的列表。

答案 1 :(得分:0)

我没有完全接受DDD的学习,但我总是将我的名词建模为类型,我很惊讶报告本身就是一个实体。 DDD与否,我不会这样做,而是我的报告反映了查询的结果,其中数量可能是count(*)或sum(lineItem.quantity),状态也是计算的(也许,页面)。

您还没有描述过您的域名,但是这些列标题有一个线索,您可能正在对数据进行调整以创建LAQty,MTLQty,您会发现在nHibernate中很难为OLTP设计我最后检查过,甚至没有UNION。也就是说,滥用HQL(Hibernate查询语言)进行轻量级报告没有任何问题,只要您了解自己正在滥用它。

我看到Stefan在描述语法方面做了很大的工作,所以我会停在那里: - )