【问题标题】:Loading presentation models directly from database直接从数据库加载演示模型
【发布时间】:2010-09-12 20:13:15
【问题描述】:

我正在开发一个 WinForms 客户端直接调用数据库的 2 层应用程序。在其中一种情况下,我需要向用户显示客户实体列表。问题是客户实体包含很多属性(有些很重),我只需要其中两个——名字和姓氏。因此,为了提高性能并使表示逻辑更清晰,我想创建某种仅具有所需属性的 CustomerSummaryViewModel 类,并使用 NHibernate 的投影功能来加载它。我在这里担心的是,在这种情况下,我的数据访问逻辑与表示相结合,在我看来这在概念上是错误的。

您认为这样可行还是有更好的解决方案?

【问题讨论】:

    标签: winforms nhibernate presentation-model


    【解决方案1】:

    我认为您可以将 CustomerSummaryViewModel 视为报告 (CustomerSummaryReport)。可以查询您的实体以获取这样的场景并将它们视为报告。大多数报告更复杂,使用多个实体和聚合查询。该报告非常简单,但您仍然可以像报告一样使用它。

    您还提到性能很重要。这是使用单独的报告查询和 DTO 的另一个原因。客户实体听起来像是您使用的“主要”实体之一。在延迟加载属性未初始化的情况下从数据库中检索它们需要大量时间,这可能是优化客户实体本身的警告,而不是使用报告查询来检索有关它们的信息。只是一个警告,因为我已经看到需要这样做的情况。

    顺便说一句,您可以考虑使用 linq 而不是投影以获得更简单的语法,例如:

    var reports = session.Linq<Customer>()
      .Where(condition)
      .Select(customer => new Report 
       { 
           FirstName = customer.FirstName, 
           LastName = customer.LastName 
       })
      .ToList();
    

    【讨论】:

    • 谢谢,帕科。将演示模型视为来自 CQRS 的报告,对吗? :) 我对它的了解非常肤浅,但根据您的描述,我认为它是“是的 - 可以直接从 DB 加载 PM”。我故意避免使用术语“DTO”,因为据我了解,它适用于分布式场景,其中数据需要通过线路发送,而这在 2 层应用程序中不存在。
    • 对于 DTO,我的意思是“哑对象”。使用表示模型作为报告是我在听说 CQRS 之前就做过的事情,但它确实适合 CQRS。
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多