【问题标题】:Prefetching data in with Linq-to-SQL, IOC and Repository pattern使用 Linq-to-SQL、IOC 和存储库模式预取数据
【发布时间】:2009-10-23 15:56:40
【问题描述】:

使用 Linq-to-SQL 我想预取一些数据。

1) 常见的解决方案是处理 DataLoadOptions,但在我的架构中它不起作用,因为:

  • 必须在第一次查询之前设置选项
  • 我使用的是 IOC,所以我不直接实例化 DataContext(我无法在实例化时执行代码)
  • 我的 DataContext 在 Web 请求期间保持不变

2) 我看到了另一种可能性,基于 loading data 及其子项 在方法中,然后仅返回数据(因此子项已经加载)@ 987654321@

然而,在我的架构中,它不能不工作:

  • 我的查询从我的存储库级联出来,可供许多将添加子句的服务使用
  • 我使用接口,linq-to-sql 对象的具体实例不会离开存储库(是的,您可以使用接口和添加子句)
  • 我的存储库是通用的

是的,这种架构非常复杂,但它非常酷,因为我可以玩乐高之类的代码;)

我的问题是:预取数据的其他可能性是什么?

【问题讨论】:

    标签: linq-to-sql architecture inversion-of-control datacontext prefetch


    【解决方案1】:

    在我的应用程序中,我可能会使用您的潜在解决方案 #2 的变体。这有点难以解释,但很简单:我使用自定义 lazy classes 在我的模型中链接和延迟延迟加载,以便从我利用 IQueryable 的 LinqToSql 特定的差异执行中抽象出来。好处:

    • 我的领域模型和服务层向上不一定必须依赖于 LinqToSql 提供程序(如果我愿意,我可以用接口替换我的 DAL)
    • 我的服务方法可以并且确实返回具有多个“锚点”的完整对象图,以便使用抽象出特定延迟加载实现的类进行延迟加载 - 所以我可以使用 LinqToSql 特定的差异执行或其他东西(例如匿名委托. 再次,请参阅this answer)
    • 我可以在整个应用程序中维护IQueryable 结果(如果我愿意,甚至可以维护到 UI),从而允许无限的 LINQ 查询链接,而不必担心性能。

    【讨论】:

    • 谢谢,这是一个非常有趣的解决方案。它以数据对象为中心,我发现它更好。不幸的是,它不能满足我当前的需求,因为我的整个架构都是基于延迟加载的,而获取的属性是例外!但是,我将尝试基于这种“以数据对象为中心”的写作方式创建 FetchItem 和 FetchList,因为我真的很喜欢它。我正在考虑使用属性来自动生成我之前所说的“CustomDCParameter”类。如果我找到可接受的解决方案(当我有时间研究它时),我会分享。仍在听取好的建议
    • 我想你可能误解了我——当你说“获取”时,你的意思是立即从数据库加载吗?而不是延迟/延迟加载?
    【解决方案2】:

    我不知道其他可能性,看来您已经将 LinqToSql 推到了极限(不过我可能错了)。

    我认为你目前最好的选择是:

    1. 向您的应用程序添加一些“非泛型”方法来处理 您想要/需要急切加载并且不需要的特定场景 为这些方法使用您的“正常”、“通用”基础架构。
    2. 使用对预先加载和延迟加载具有更复杂支持的 ORM。

    【讨论】:

    • 感谢您的回答 1)我可以放一些非通用代码,但真正的问题是我真的希望我的层是分开的。我的查询由服务层操作,数据库调用由它们(透明地)触发,我不想在其中添加技巧代码;)必须支付松散耦合:p 2)您可能是对的。当前项目为时已晚,但对于下一个项目,我将使用其他 ORM 进行一些测试。有什么建议吗?理想情况下,符合 linq 的东西会很棒(我真的很喜欢使用它)
    • 松耦合有时会以增加复杂性为代价。您可以选择如何进行权衡。 NHibernate 对急切和延迟加载具有复杂的支持,并且还支持 Linq,但可能还有其他 ORM 也可以满足这些要求。
    【解决方案3】:

    我找到了解决方案。 我的回答是“依赖注入”。

    它通常与 IOC 一起提供,这意味着您可以让您的 IOC 容器在实例化时管理类的注入。

    我只需要在实例化 DC 时注入一个 CustomDCParameter 类。 该类将包含规则,构造函数将应用所有规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2013-12-14
      • 2012-02-21
      • 2010-09-23
      相关资源
      最近更新 更多