【问题标题】:How to provide Prompt Lists in an NHibernate WinForms application如何在 NHibernate WinForms 应用程序中提供提示列表
【发布时间】:2009-10-21 22:48:36
【问题描述】:

背景

使用 NHibernate 的 WinForms 应用程序。应用程序采用 MDI 样式,每个 MDI 子窗体在 Load 时打开一个新的 NHibernate 会话,该会话在窗体的生命周期内保持打开状态。

问题

我的应用程序基本上是一个“订单管理”或“采购”系统。一种特定形式使用大量“查找”列表。比如产品列表、供应商列表、位置列表、UnitsOfMeasurement 列表、PriceQuotes 列表等。

大量列表,所有列表在构建表单时加载。

问题:我需要查找列表,但我需要加载更快的表单。表单执行所有查找所需的时间太长。如何获得更好的性能并保留查找列表?

我的想法

  • 我是否可以加载一次查找列表并在应用程序的整个生命周期中保留它们,并定期检查列表是否过时?

  • 我可以只加载列表的文本描述,而不是持有一堆 IList、IList 等,我可以持有一堆 IList,然后当我保存时,针对 NHibernate 执行 Gets获取实物。

  • 还有其他我没有想到的方法吗?

【问题讨论】:

    标签: winforms nhibernate


    【解决方案1】:

    您绝对应该缓存缓慢变化的数据以提高性能。您需要多久检查一次过时数据取决于数据类型和您的业务,例如计量单位可能不会像产品列表那样频繁变化。您还应该提供一种手动刷新列表的方法,以便用户在出现某些缺失时可以刷新它们。

    如果您需要列表中的业务对象来执行数据库操作,您可以调用 ISession.Lock(obj) 将对象锁定到当前的 ISession 中。需要注意的一件事是锁不会自动级联到子对象:我认为有一个映射设置可以做到这一点,或者您可以手动进行。

    【讨论】:

    • 是的,我知道我需要做一些事情来让业务对象进入当前会话,我需要阅读 Lock()。我认为这种方法对我来说更容易,因为我有完整的对象可以使用。持有 ID 和描述似乎也可以,但在节省时间转换这些 ID 似乎需要更多工作。
    【解决方案2】:

    您是否正在向您的 UI 发送完整对象的列表?我最近在数据层和 UI 之间使用 DTO 开发了一个应用程序,所以我没有发送完整的对象,只是一个描述和一个标识符。这可以帮助您删除一些不需要的数据。所以基本上当屏幕加载一个服务调用时,nhibernate 会为我的列表框获取我想要的所有对象,然后 UI 绑定到列表。我将列表框显示成员绑定到描述,将值成员绑定到标识符。

    【讨论】:

    • 我确实考虑过这一点,但我不想为了保存而承担额外的复杂性。我将尝试在内存中缓存对象,因为它会给我完整的对象来使用。如果失败了,那么我的下一个方法是 ID+Descr 方法并在保存时转换为完整对象。
    猜你喜欢
    • 2013-07-07
    • 2019-08-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多