3

使用Linq-to-SQL我想要预取一些数据。使用Linq-to-SQL,IOC和存储库模式预取数据

1)常见的解决方案是应对DataLoadOptions,但在我的建筑将无法正常工作,因为:

  • 的选项具有第一查询
  • 我前设置使用国际奥委会,所以我不直接实例化DataContext的(我不能instanciation执行代码)
  • 我的DataContext是一个Web请求期间持续

2)我已经看到了另一种可能基于装载数据及其孩子的的方法,那么仅返回数据(所以孩子已经装入)see an example here

然而,在我的建筑,它不能不行:

  • 我的查询级联了我的仓库,并且可以通过许多服务消费将增加的条款
  • 我用的接口工作,LINQ到SQL对象的具体情况不离开存储库(是的,你c与界面的工作,并增加条款)
  • 我的仓库是通用

是的,这种架构是安静复杂,但它非常酷,因为我可以用乐高积木一样的代码打;)

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

回答

1

在我的应用程序中,我使用了可能的解决方案#2的变体。这是有点难以解释,但简单地说:我链并推迟延迟加载在我的模型与自定义lazy classes,以抽象从LinqToSql特定的不同执行,我利用IQueryable的优势。优点:

  • 我的域模型和服务层向上不必依赖于LinqToSql提供商(我可以换我的DAL与接口,如果我愿意的话)
  • 我的服务方法可以做回完整具有多个“锚点”的对象图形,用于使用抽象掉特定延迟加载实现的类来进行延迟加载 - 所以我可以使用LinqToSql特定的不同执行或其他方法(例如,anon delegates,请参阅this answer
  • I可以在整个我的应用程序中保持IQueryable的结果(即使对于用户界面也是如此),从而允许无限的LINQ查询链接不必担心性能。
+0

谢谢,这是一个非常有趣的解决方案。它以数据对象为中心,我发现它更好。不幸的是,它不能回答我当前的需求,因为我的整个架构都基于延迟加载,并且提取的属性是例外!然而,我会尝试基于这种'以数据对象为中心'的写作方式创建一个FetchItem 和FetchList ,因为我非常喜欢它。我正在考虑使用属性来自动生成我之前说过的'CustomDCParameter'类。如果我找到一个可接受的解决方案(当我有时间处理它时),我会分享。仍然听好的建议 – Mose 2009-11-09 11:48:01

+0

我想你可能会误解我 - 当你说'抓''你的意思是立即从数据库加载?而不是懒/加载延迟? – 2009-11-09 12:38:31

1

我不知道其他的可能性,似乎你已经推动LinqToSql的极限(但我可能是错的)。

我觉得在这一点上你最好的选择是:

  1. 添加一些“非一般”的方法,以您的应用程序来处理只是你想要/需要预先加载和不 的 特定场景对这些方法使用您的“普通”,“通用”基础设施。
  2. 使用ORM具有更复杂的支持以进行急切和延迟加载。
+0

谢谢您的回答 1)我可以把一些非通用代码,但真正的问题是,我真的希望我的层进行分离。我的查询由服务层操纵,数据库调用由它们触发(透明地),我不想在其中添加特技代码;) 必须支付松耦合:p 2)您可能会对。对于当前的项目来说已经太迟了,但对于下一个项目我会用其他ORM做一些测试。有任何建议吗?理想情况下符合linq的东西会很棒(我真的很喜欢它) – Mose 2009-10-26 10:00:20

+0

松耦合有时会以增加复杂性为代价。这是你的选择,你想做出这种折衷。 NHibernate对于加载和延迟加载有着复杂的支持,并且也支持Linq,但也可能有其他ORM满足这些要求。 – 2009-10-26 11:35:00

0

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

它通常与IOC一起交付,并且意味着您可以让您的IOC容器管理实例注入类。

所有我需要的是,当我实例化一个DC中注入CustomDCParameter类。 该类将包含规则,构造函数将应用所有这些规则。