我从博客文章中读到了Greg Young的文章。我看到Query正在从数据库中获取数据。我们使用Query DTO对象来填充 UI 屏幕。并建议使用包含纯SQL查询的薄层。不建议使用 Nhibernate或EF 等 ORM 工具。因为他们使用延迟加载,所以在数据库上运行多个查询。
例如,我有一个订单屏幕。这应该是显示订单信息和订单行项目。
public class OrderDto{
public string Name {get; set;}
public string Date {get; set;}
public IEnumerable<OrderLineItem> {get; set;}
}
要创建 OrderDto 实例,我应该向订单表发送查询,然后向 OrderLines 表发送查询。我认为ORM工具会做同样的事情。那么为什么要使用普通的SQL和新的薄层?
答案 0 :(得分:2)
我不知道您所指的具体博文或引文,所以我无法直接解决这个问题。
然而,对ORM的反对意见是许多项目将它用于查询和命令,使用相同的对象。因此,如果您使用Order对象进行保存(命令),然后当您想要在屏幕上显示订单列表,并通过获取Order对象列表(查询)来执行此操作时,您可能不会遵守CQRS的基本原则。
另一方面,如果您使用EF Order对象进行保存,但使用EF Linq查询投影到OrderDTO列表中,我认为没有人会反对您使用EF(或者任何ORM)。
答案 1 :(得分:0)
“[...]因为他们使用延迟加载,所以在数据库上运行多个查询。[...]”
好吧,不。你可以告诉你最喜欢的ORM不要使用延迟加载。在这种情况下,您很可能会执行两个查询,具体取决于您在示例中的指定方式。
BTW,关键在于,因为您有两个单独的命令和查询模型,所以您不必使用ORM来查询数据存储,因此如果要优化查询服务,则不应使用它。
相反,ORM的好处在Command方面更明显。
答案 2 :(得分:0)
我不确定使用纯SQL背后的原因是什么,因为问题中没有包含特定的博客文章。
在您的示例中,您不需要两个不同的查询来获取订单和订单行。通常,您可以使用连接两个表(订单和订单行)的查询,NHibernate也支持相同的查询。
当您使用像NHibernate这样的ORM时,它支持做得更好,使用QueryOver / HQL等功能,您可以直接填充DTO,同时只从数据库中获取所需的列。在这些情况下,延迟加载不起作用。