我总是在所有地方插入我的Linq2SQL查询,几乎每个类都在这里。
我想知道你在哪里放置Linq2SQL查询的策略?
您是将它们放在单独的数据层类中,还是将它们存储在遍布各处的地方?
我认为我需要改变Linq2SQL查询的策略并将它们存储到单独的DataLayer类中。我认为,如果我能够有效地进行TDD并遵守依赖注入和固体原则,那是必须的。
答案 0 :(得分:6)
我将所有LinqToSQL调用完全包装到一个DAL中。我的网站和业务层不了解我正在使用的持久性框架。这样,如果LinqToSql真的死了,或者如果我决定要使用一个全新的框架,我就不必追捕我调用DB的所有地方。
它还有助于可重用性。我可以在使用相同数据库的其他项目中使用相同的Business或DAL。
答案 1 :(得分:5)
LINQ是一种语言结构。它需要的是你的DAL将你的实体暴露为IEnumerable或IQueryable,你可以使用LINQ来反对它。您的DAL可以基于LINQ2SQL或LINQ2Entities或您自己的自定义代码 - 只要它正确地暴露您的实体。如果你使用LINQ2SQL,你会获得一些优势,例如延迟查询执行,但并不是绝对必要的。我认为避免在DAL之外使用LINQ没有意义。如果我想用基于LINQ2SQL的其他东西替换DAL,我可以。只要我维护基于LINQ的代码所期望的接口,我就可以了。
编辑:对我来说,最重要的是,直到他们达到DAL,他们不是LINQ2SQL查询,他们只是LINQ。 LINQ不会从语言中消失,除非它被更好的东西取代。使它成为LINQ2SQL的原因是DAL是用LINQ2SQL实现的。我的其余代码不知道(或关心)这是如此。它可能是LINQ2Objects或LINQ2Entities或......
答案 2 :(得分:3)
将所有Linq2SQL查询放入一个单独的类中,可以在测试访问它的业务对象时轻松地用“mock / stub”替换它。
或者我错了?
答案 3 :(得分:1)
如果您认为您的LINQ查询是LINQ2SQL查询,那么您会略微忽略这一点。
您有LINQ查询。您的业务层通过在数据层(datacontext)上进行LINQ查询来访问数据层。 LINQ2SQL是允许LINQ查询访问SQL Server的组件。
这是一个严重的过度简化,但一般的观点是,如果你将所有LINQ隐藏在业务层之外,你并没有真正从其存在的理由中受益。
如果LINQ2SQL不允许您将数据库模式抽象到您喜欢的程度,那么您应该考虑使用实体框架。
答案 4 :(得分:0)
当我需要访问数据库时,我使用连接字符串(该数据库)和映射文件(要映射的表)实例化Helpers.DataContext。
这可以很好地解决问题。
答案 5 :(得分:0)
我亲自创建“基础”查询并公开IQueryable。
在我的业务对象中,我喜欢返回具体的结果,所以我通常只将QueryByExpression样式方法设为内部,然后创建方法存根,我可以在其中传递我的条件,并在方法中处理查询,得到来自数据库的结果,并返回结果的IEnumerable,而不是暴露应用程序的其余部分需要上下文或任何内容。
但是,就像上面提到的许多人一样,我必须同意 - 将你的IQueryable暴露给你的代码并不可怕,它只是让你更加依赖你的Linq2Sql东西。
如果您不介意创建公开方法的业务对象,但不公开IQueryable类型,我觉得更好,但设置和配置业务对象更加繁琐。我觉得它也更容易测试,但那只是我。还要重新使用,如果你修复了一个bug,它在2年后的代码中就不存在于30个不同的位置。
只是我的2cents。
答案 6 :(得分:0)
我不一定会创建单独的业务对象,因为这是LINQ2SQL的重点,你将重新创建很多使LINQ2SQL如此出色的东西。
但是我建议使用包含L2SQL代码的静态类创建一个类库。这为您提供了能够替换单个程序集以更改业务逻辑的优势。此外,如果您有额外的方法来访问数据,那么静态类就是该逻辑的好地方。
如果您的需求有点复杂,并且您不介意创建自己的映射,我会同意Florian。
答案 7 :(得分:0)
我的最新项目使用ASP.NET MVC框架和LINQ-to-SQL。出于这个原因,我在很大程度上依赖于我的数据层的Repository模式。由于这是我的第一个LINQ-to-SQL项目,因此数据库模式在单个DataContext类中表示。随着后来的项目的出现,我可以分解出常见的DataContexts以供重用。
我创建了一个接口,其中包含我计划为特定存储库实现的所有签名,该存储库通常表示单个复杂对象。基于该接口,我实现了两个类:一个用于生产,一个用于测试。我所有的LINQ-to-SQL查询都保存在存储库类中。在我的控制器代码中,我访问了我的数据访问方法的存储库。我的观点中不包含查询;我使用自定义视图模型类,它们使用存储库方法填充在控制器中。
答案 8 :(得分:0)
我在DAL DLL中使用了Linq2SQL。我喜欢关注点的分离以及任何其他站点或应用程序需要访问相同的数据库,您可以从DLL中重复使用相当多的代码。因此,所有Linq2SQL都存储在此DAL中。现在对于Linq本身,我根据需要在我的服务和表示层中使用它。
Linq2SQL DLL布局
创建映射.dbml文件以将SQL table.columns映射到Linq目录(SqlRepository)
编写与Service层类匹配的sql repository类,并使用正确的Linq Catalog类。
为每个sql存储库类添加了接口,以便服务层直接使用接口
编写了sql存储库类与服务层来回传递的业务模型。