【问题标题】:Should I define a single "DataContext" and pass references to it around or define muliple "DataContext" where ever I end up needing them?我应该定义一个“DataContext”并传递对它的引用还是在我最终需要它们的地方定义多个“DataContext”?
【发布时间】:2010-06-09 15:42:35
【问题描述】:

我有一个 Silverlight 应用程序,它由一个 MainWindow 和几个在 MainWindow 上更新和绘制图像的类组成。我现在正在扩展它以跟踪数据库中的所有内容。

不谈细节,假设我有这样的结构:

MainWindow
  Drawing-Surface
    Class1 -- Supports Drawing
      DataContext + DataServiceCollection<T> w/events
    Class2 -- Manages "transactions" (add/delete objects from drawing)
    Class3

每个“类”都被传递一个对绘图表面的引用,因此它们可以独立地与之交互。

我开始在 Class1 中使用 WCF 数据服务,它运行良好;但是,其他类也需要访问 WCF 数据服务。 (我应该在 MainWindow 中定义我的“DataContext”并将引用传递给每个子类吗?)

Class1 需要对“事务”数据进行读取访问,而 Class2 将需要对某些绘图数据进行读取访问。所以我的问题是,在哪里定义我的 DataContext 最有意义?

这样做是否有意义:

  1. 定义一个“全局”WCF 数据服务“上下文”对象并在我的所有后续类中传递对它的引用?
  2. 为每个 Class1、Class2 等定义一个“上下文”实例
  3. 是否每个需要访问数据的方法都定义自己的“上下文”实例并使用闭包处理异步加载/完成事件?

这样的结构会更有意义吗?长时间保持活动的“DataContext”打开有什么危险吗?此应用程序的典型用例可能需要 1 分钟到 40 多分钟。

MainWindow
  Drawing-Surface
  DataContext
    Class1 -- Supports Drawing
      DataServiceCollection<DrawingType> w/events
    Class2 -- Manages "transactions" (add/delete objects from drawing)
      DataServiceCollection<TransactionType> w/events
    Class3
      DataServiceCollection<T> w/events

【问题讨论】:

    标签: .net wcf silverlight wcf-data-services


    【解决方案1】:

    一般而言,您不应将上下文保留太久。上下文包含对您从中获得的所有实体的引用(除非您关闭更改跟踪),因此如果您坚持使用它,您也将所有实体都保存在内存中。 如果您的访问是只读的,那么我真的只会考虑实体的生命周期(以及与之相关的内存消耗)。 如果您的访问是读写的,那么如果您有两个上下文并从一个对某个实体进行更改,则另一个将看不到它。因此,在这种情况下,您可能需要一个单一的上下文。但寿命问题仍然适用。

    因此,如果您知道自己不会使用很多不同的实体,为了简单起见,我会只使用一个上下文(它允许您共享实例)。如果您知道要使用大量实体,那么我会考虑偶尔删除上下文(在应用程序中的某个逻辑位置)。

    【讨论】:

    • 如果我要进行大量读取、大量更新和新记录怎么办?每个会话大约 100 秒。你会将其归类为“很多实体”吗?
    • 100 并不是一个大数字。但是,如果您已经有了会话的概念,我强烈建议您为每个会话创建一个新的上下文,并在完成会话后将其删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2020-03-02
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多