LINQ to SQL DAL + BLL + Presentation

时间:2011-10-10 09:40:49

标签: linq linq-to-sql

我是LINQ to SQL的新手,并为简单的应用程序进行了以下设置:

1)从我的数据库表(DAL?)生成LINQ to SQL类

2)创建了使用LINQ to SQL datacontext的类(BLL?),以插入,更新,删除,选择

3)在我的表示层中,当插入时,例如一个新的“产品”,我正在创建一个对象“Product”的新实例,它来自我的DAL层(这是LINQ to SQL为我创建的)

我的问题是,在这种情况下,这是否是分层的正确方法。对我来说很奇怪的是我使用的是DAL中定义的对象类型,如果你问我,它不应该在表示层中使用。但是,如果我想在不再创建新对象的情况下使用LINQ to SQL对象,这似乎就是要走的路。

您对此有何建议?我是LINQ的新手,所以我不确定这里最好的方法是什么。

感谢帮忙

1 个答案:

答案 0 :(得分:4)

我认为没有一个通用的解决方案,但是,如果你有一个简单的应用程序,你可能不希望不必要地复杂化 如果您能够保持数据上下文在您的表示层打开,那么保留L2SQL实体可以获得一些“生产力”:

  • 支持延迟加载(虽然注意1:N问题)
  • 您有一组生成的实体(虽然知道datacontext)

但是,对于更重,更纯粹的架构,您可以考虑

  • Repository Pattern
  • 中包装Linq2SQL工件
  • 将L2SQL实体映射到POCO,然后再将它们返回到BLL / Service Tier
  • 根据您的网络和演示架构,您可能还需要考虑通过网络实现的实体(序列化,WCF,JSON等),您也可以查看View Models,在这种情况下您的实体在层之间进行映射和转换时,它会“改变”类和形状。
  • 事实上,您可能会完全考虑另一个ORM而不是Linq2SQL,例如: NH或EF

修改 如果您不想在BLL或表示层中使用VS生成的L2SQL实体,那么您有几个选项。

  • 创建一组新的POCO,然后将L2SQL实体映射到您的repository / dal中。 Automapper可以简化此任务。

  • 您可以通过提供XmlMappingSource直接在Linq2SQL中使用自己的POCO,尽管这样做有点多了。