【问题标题】:Encapsulate context constructor on a query object在查询对象上封装上下文构造函数
【发布时间】:2015-04-23 01:55:53
【问题描述】:

创建一个同时包含查询和上下文构造函数的类作为 TEntity 的 Context 的 Func 和 IQueryable 的 Func 来解决上下文生命周期问题是个好主意吗?

示例: 在您的数据层上,如果您使用“using”语句为每个方法使用一个上下文,则无法返回 IQueryables,因为在释放上下文后这将无效,这使您可以使用:

  • 每个表单一个上下文(这需要将表单上下文注入数据层)
  • 线程静态上下文
  • 在返回查询之前调用 ToList()(禁用查询组合)

【问题讨论】:

    标签: c# linq entity-framework design-patterns


    【解决方案1】:

    据我所知,上下文的设计目的是根据需要创建和重新创建,而不是静态地保存在内存中(尽管我也是这样做的)。我发现在我的类中创建一个上下文通常是非常好的(比如 MVC 应用程序的控制器类,甚至是视图模型类),然后让所有方法都使用它。

    但是,如果您想要为所有用户缓存大量静态数据,我已将其静态保存在内存中。正如您所提到的,您只需要考虑线程。如果你是只读的,你可以创建只读锁来访问这些数据(不是 C#lock{})。

    如果是静态的,更多细节:https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock(v=vs.110).aspx

    在大多数情况下,您实际上并不需要处理它们 - 这是设计使然 https://stackoverflow.com/a/389871/1236397

    【讨论】:

    • 每个 ViewModel 都有一个上下文的问题是你应该让你的 ViewModel IDisposable,因为它现在有一个 IDisposable 的引用(这就是上下文),这会让你不得不处理你的正确查看模型(太复杂)。我并不是说您的查询对象应该具有对上下文的引用,而是对返回上下文的委托,并在内部使用该委托 (Func) 仅在需要时创建短期上下文
    • 为什么不让GC处理呢?我从来不需要为使用这种方法的视图模型实现IDisposable,而且我从来没有遇到过任何问题。
    • 坦率地说,我之前没有遇到过让上下文保持活力的问题,但在问这个问题之前,我已经在几个地方阅读过不同的创建和释放上下文的机制以及它的实体的污染缓存,所以我正在寻找一种方法来创建它并正确处理它。
    • 我没有看到你的编辑,这就是答案。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多