【问题标题】:Design Pattern for using XML as a list structure in C#在 C# 中使用 XML 作为列表结构的设计模式
【发布时间】:2010-12-30 08:55:00
【问题描述】:

我正在 C# WinForms 中设计一个基于列表的应用程序,我想将我的数据存储在 XML 文件中(最终将序列化到数据库中)。我有一个自定义控件,它根据我的 XML 显示我的列表数据,但我无法确定处理数据的最佳结构。我有一个跟踪 XMLDocument 的 ListManager 类,并具有 CreateList 和 AddListItem 等方法。我应该使用 XML 结构的本地副本作为我的 UI 控件读取的内容,还是应该使用实际的 XML 文件本身?有没有比 XMLDocument 更好的东西我应该存储为成员变量来保存数据?

另外,我应该如何将控制器与 UI 控件链接起来?换句话说,当添加新项目时,我的 ListManager 应该如何提醒 ListControl? (或者它根本不应该做更新通知,而是主窗体应该这样做?)

谢谢!

【问题讨论】:

    标签: c# .net winforms model-view-controller


    【解决方案1】:

    我将创建一个自定义类来使用强类型集合(例如泛型集合 System.Collections.Generic.List)来保存我的数据。然后,您可以在客户端上将此类与 XML 进行序列化,直到您准备好将内容推送到数据库中。使用序列化意味着您可以使用普通的旧 C# 对象,而不是试图将 XMLDocument 类硬塞到您的业务对象中。

    查看this article 了解有关序列化工作原理的一些详细信息。

    【讨论】:

    • 这是有道理的。我将尝试从数据持久性中抽象出数据表示。谢谢!
    • 希望对您有所帮助。如果你被难住了,我整理了一些帮助类,以便在我正在处理的项目中更容易。如果你想要的话,我可以给你一份。
    【解决方案2】:

    恕我直言,您描述的场景可能适用于多种策略,您选择实施策略的关键标准可能是“数据流”的动态性质以及您正在处理的数据的绝对规模。

    如果您描述的情况是您正在处理大量数据存储,因此由于内存限制,您将无法维护“整个”外部文件的内部表示:这是一种情况:在这种情况下您将需要“虚拟化”,该词用于描述在任何给定时间呈现数据的“部分视图”,并且可能需要缓存,以便您保留尽可能多的数据“准备显示” 。”或者您可以选择使用另一个内置“虚拟部分显示”的控件进行显示(如 DataGridView)。

    如果您正在处理添加新数据、删除或编辑现有数据的“异步流”,每分钟数百(或数千)次,以任何顺序(可能来自多个用户?),这是另一种情况。

    所以,当我建议您考虑以下策略时:

    1. ListManager 引发自定义事件以通知订阅者数据更改

    2. 自定义控件(我们假设处理演示文稿)订阅由 ListManager 类引发的感兴趣的事件,并且“做正确的事”:这可能涉及从 ListManager 请求另一个“服务”数据,或其他任何东西,以使当前演示文稿保持最新状态。

    请考虑这可能反映了最简单的情况。

    【讨论】:

    • 可以想象,该列表可以在应用程序的未来版本中异步更新,但一次更改它的用户几乎不会超过 4 或 5 个。此外,这些列表目前还不足以保证虚拟化,但我会记住这一点。我觉得使用事件可能是通知视图更新数据的最佳选择。事件是否应该将业务对象作为 UI 控件更新的参数传递?还是应该在从 ListManager 对象本身接收到事件后请求它?
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多