Linq to sql 您是将Linq2SQL查询放在所有地方还是放在专用的DAL类中?

Linq to sql 您是将Linq2SQL查询放在所有地方还是放在专用的DAL类中?,linq-to-sql,tdd,solid-principles,Linq To Sql,Tdd,Solid Principles,我总是到处插入我的Linq2SQL查询,几乎每个类都是如此 我想知道关于将Linq2SQL查询放在哪里,您的策略是什么 您是将它们放在单独的数据层类中,还是将它们存储在各地使用的地方 我认为我需要改变Linq2SQL查询的策略,并将它们存储到单独的数据层类中。如果我想有效地进行TDD并遵守依赖注入和可靠原则,我认为这是必须的。如果您认为您的LINQ查询是LINQ2SQL查询,那么您就有点忽略了这一点 您有LINQ查询。业务层通过在数据层(datacontext)上进行LINQ查询来访问数据层。L

我总是到处插入我的Linq2SQL查询,几乎每个类都是如此

我想知道关于将Linq2SQL查询放在哪里,您的策略是什么

您是将它们放在单独的数据层类中,还是将它们存储在各地使用的地方


我认为我需要改变Linq2SQL查询的策略,并将它们存储到单独的数据层类中。如果我想有效地进行TDD并遵守依赖注入和可靠原则,我认为这是必须的。

如果您认为您的LINQ查询是LINQ2SQL查询,那么您就有点忽略了这一点

您有LINQ查询。业务层通过在数据层(datacontext)上进行LINQ查询来访问数据层。LINQ2SQL是允许LINQ查询访问SQL Server的组件

这是一个严重的过分简化,但一般的观点是,如果你把所有的LINQ都隐藏在业务层之外,你就不会真正从它存在的原因中受益


如果LIQ2SQL不允许您将DB模式抽象为您喜欢的程度,那么您应该考虑使用实体框架来代替。

< P>将所有的LIQ2SQL查询放到单独的类中,在测试访问它的业务对象时,很容易用“模拟/存根”替换它。


还是我错了?

我将所有LinqToSQL调用完全打包到一个DAL中。我的网站和业务层对我正在使用的持久性框架一无所知。这样,如果LinqToSql真的死了,或者如果我决定使用一个全新的框架,我就不必搜索我调用DB的所有地方


它还有助于提高可重用性。我可以在使用相同数据库的其他项目中使用相同的业务或DAL。

LINQ是一种语言构造。它只需要DAL将您的实体公开为IEnumerable或IQueryable,并且您可以对其使用LINQ。您的DAL可以基于LINQ2SQL或LINQ2Entities或您自己的自定义代码——只要它正确地公开了您的实体。如果使用LINQ2SQL,您会获得一些优势,比如延迟查询执行,但这并不是绝对必要的。我认为在DAL之外避免使用LINQ没有任何意义。如果我想用其他不基于LINQ2SQL的东西替换DAL,我可以。只要我维护基于LINQ的代码所期望的接口,我就可以了

编辑:我的底线是,在它们到达DAL之前,它们不是LINQ2SQL查询,它们只是LINQ。LINQ不会从语言中消失,除非它被更好的东西取代。之所以使用LINQ2SQL,是因为DAL是用LINQ2SQL实现的。我的代码的其余部分并不知道(或关心)这是真的。它可以是LINQ2对象或LINQ2实体或…

  • 我使用外部映射
  • 域类位于单独的程序集中
  • datacontext位于助手程序集中
  • 我有许多xml映射文件
当我需要访问数据库时,我实例化Helpers.DataContext,其中包含一个连接字符串(哪个数据库)和一个映射文件(映射哪些表)

这可以很好地分离关注点。

我个人在中创建了“基本”查询,并公开IQueryable

在我的业务对象中,我喜欢返回具体的结果,因此我通常只将QueryByExpression样式的方法设置为内部,然后创建方法存根,在该方法中我可以传递我的条件,并在该方法中处理查询,从数据库中获取结果,然后返回结果的IEnumerable,不公开应用程序的其余部分以需要上下文或任何内容

但是,正如上面许多人所说的,我必须同意——将IQueryable暴露于代码并不可怕,它只是让您与Linq2Sql的东西更紧密地联系在一起

如果您不介意创建公开方法但不公开IQueryable类型的业务对象,我觉得这样更好,但设置和配置业务对象更繁琐。我觉得测试也比较容易,但那只是我自己。也要考虑到可重用性,如果你修复了一个bug,那么2年后它就不会出现在你代码中的30个不同的地方


就我的20美分

我不一定要创建单独的业务对象,因为这是LINQ2SQL的要点,您将重新创建许多使LINQ2SQL如此伟大的东西

不过,我建议创建一个包含L2SQL代码的静态类的类库。这使您能够替换单个程序集来更改业务逻辑。此外,如果您有额外的方法来访问数据,那么静态类是实现该逻辑的好地方


不过,如果您的需求稍微复杂一点,并且您不介意创建自己的映射,我会同意Florian的观点。

我的最新项目使用ASP.NET MVC框架和LINQ to SQL。因此,我在很大程度上依赖于数据层的存储库模式。因为这是我的第一个LINQtoSQL项目,所以数据库模式在单个DataContext类中表示。随着后续项目的出现,我可以分离出公共数据上下文以供重用


我创建了一个接口,其中包含我计划为特定存储库实现的所有签名,该存储库通常表示单个复杂对象。基于该接口,我实现了两个类:一个用于生产,一个用于测试。我所有的LINQ到SQL查询都保存在存储库类中。在控制器代码中,我访问数据访问方法的存储库。我的观点中不包含任何疑问;我使用自定义视图模型类,这些类使用存储库方法填充到控制器中。

我在DAL DLL中使用了Linq2SQL。我喜欢将关注点和其他需要访问相同d的站点或应用程序分开