使用LinqToSql Winforms应用程序架构

时间:2009-07-30 18:58:37

标签: winforms linq-to-sql architecture

我正在开始一个新的Winforms应用程序,我总是在我的DAL中使用传统的ADO.NET方法(...是的,硬编码!)

我以前在很多次点上使用过Linq,但是对于 adhoc 查询更多,所以我对它有一些经验,我喜欢编写查询代码是多么容易。我想做的或是用纯LINQ查询替换现有的DAL。我知道他们可能会对此感兴趣,这就是我需要你帮助的原因。

如果我不得不做过去一如既往的事情,我会构建我的应用程序:

  • [AppName] .ClientUI - >桌面客户端Presentaion图层
  • [AppName] .WebUI - >网络表示层
  • [AppName] .DAL - > ADO.NET数据访问层
  • [AppName] .BLL - >业务逻辑层(验证,额外计算,+经理类)
  • [AppName] .BE - >包含业务对象和集合类的业务实体

说实话,我总是在网络应用程序中使用它,之前从未使用过n层的Winforms应用程序。

如果我想用LINQ替换旧的DAL方法,我将面临哪些挑战。

最后,是否建议在多层应用中使用LINQ?有时我认为使用旧的ADO.NET方法仍然更好...更多的工作,但更好。我的意思是 - 如果我错了,请纠正我 - 所有这些新技术的核心(旨在使我们的工作更好的开发人员)是不是他们仍然使用传统的ADO.NET ???

希望有人能够对此有所了解! :)

2 个答案:

答案 0 :(得分:2)

我已经两种方式完成了。

你是对的,手动滚动ADO.NET DAL是更多的工作,那么你是否可以获得额外工作的性能优势?是的,当您使用Linq to SQL类时,您将从顶部获得大约7%到10%的开销。但是,对于这么小的开销,你会获得很多好处:

  • 延迟加载(通过推迟执行查询来提高性能,直到实际需要它们)
  • CRUD免费,内置 并发处理
  • Linq,IQueryable,以及所有 善良提供
  • 部分类允许您插入 业务逻辑和验证int 你的Linq to Sql类,没有 担心Linq to SQL代码 发电机覆盖它们。

当然,如果你不需要任何这些东西,那么Linq to SQL可能看起来很奢侈。但是,我发现Linq to SQL更容易维护,特别是因为如果数据库发生更改,可以重新生成DAL类。

是的,Linq to SQL使用了ADO.NET。

Linq to SQL的多层故事不太清楚,很大程度上是由于DataContext对象需要处理的方式。我建议查看这个CodePlex项目:

Linq to Sql的多层体系结构示例
http://www.codeplex.com/MultiTierLinqToSql

答案 1 :(得分:2)

对于直接连接到数据库的直接winforms客户端应用程序,Linq是ADO.NET的一个很好的替代品,你会遇到很少的陷阱。使用SQLMetal之类的工具(或VS2008内置的设计器)生成Linq数据对象和数据库连接类。如果你想使用生成的对象作为“BE”对象,你可以只复制这些东西并将其移动到你想要的任何程序集(如果你想分离程序集)。或者,您可以只提供单独的“业务实体”和转换层,将来自BE的数据复制到Linq生成的对象,然后再返回。

我曾经多次遇到Linq的一个问题是它对断开连接的架构没有很好的支持。例如,如果您想在服务器上安装DAL并将所有客户端应用程序连接到服务器上,那么只要让linq对象在服务器上传输就会遇到问题。

如果您确实选择具有单独的业务实体(或具有断开连接的体系结构),您将发现必须仔细管理从数据上下文中断开Linq对象,然后在准备保存/更新时重新连接它们。首先要在这个领域做一些原型设计,以确保你了解它是如何工作的。

经常让人们兴奋的另一件事是linq查询不会立即针对数据库执行,它们只在需要数据时执行。请注意这一点,因为如果你不期待它可能会让你失望(并且在调试时很难发现,因为当你在调试器中查看你的linq查询时它将执行以获取数据)。

同样值得考虑将Entity框架作为linq2sql的替代方案(您仍然可以使用linq2EF查询)。 EF是一个更完整的ORM,并且更好地支持将相关表映射到多个对象,但仍然受到对断开连接的应用程序的不良支持。 .net 4.0中的EF应该对断开连接的体系结构有更好的支持。