5

我们将在 .Net 中重建我们的网站之一。我读过很多文章,非常喜欢将我们的项目分成数据访问层 (DAL)、业务逻辑层 (BLL) 和表示层的想法(我们来自经典 ASP,所以这对我们来说是一个巨大的进步)。我也很喜欢 Linq to SQL。

既然Linq to SQL的目标是快速开发,那么Linq to SQL真的可以有DAL、BLL和表现层吗?使用 Linq to SQL,DAL 会返回可能在 BLL 中修改的实体或 linq 代码吗?DAL 和 BLL 与 Linq to SQL 之间的关系似乎是一个模糊的话题,没有达成共识——因为这对我们来说是一个巨大的飞跃,我绝对希望在深入研究之前有一个好的游戏计划。

类型化数据集似乎更适合这一点,但如果我能用 Linq 得到类似的东西,我会走那条路。

我想远离 nHibernate 和其他 3rd 方库。

4

5 回答 5

5

我们正在构建您所描述的内容,并且我们正在使用 L2S 来完成它。同意 DAL 和 BLL 之间的关系有点模糊,但是我们有一个不同的 BLL 和一个不同的 DAL。我们所有的逻辑都在 BLL 中,所有数据检索/修改都是通过调用 DAL(使用 LINQ 调用)完成的。

我们的应用程序不使用类型化数据集。我们已经构建了实体类来表示我们的对象。现在我已经花了几个月的时间来构建其中的一部分,我认为我们(我)不会再回到数据集了。

另外,我不会对 L2S 被“以快速发展为目标”挂断电话。这使它听起来像一个原型设计工具。我们发现它是一种工业强度工具。这可能与微软现在所说的相反,因为他们宁愿人们使用 EF。

兰迪

于 2009-12-29T16:42:25.577 回答
3

我建议退后一步,再次查看您的要求。

您需要真正的 3 层(即物理部署到不同的机器)还是只需要对应用程序进行逻辑分区?

我在编写的第一个大型应用程序中就犯了这个错误。我从不需要物理的 3 层(也永远不需要),但以这种方式设计了应用程序。最显着的后果是我的 Linq2Sql 不支持实体上的断开连接的更改跟踪。我使用Linq2Sql Entity Base来解决这个限制,但是它非常严重地违反了 Persistence Ignorance 的概念(之后总是知道更好,对吧?)。

走向真正的 n 层对应用程序架构有很多其他的影响

您将需要消息传递、数据传输对象等。Linq2SQL 是一个不错的 ORM,与 LINQ 的紧密集成提供了独特的可能性。其他 ORM 仍需要一些时间才能赶上。NHibernate 3.0 是这里隧道尽头的一盏灯。如果您有简单的数据模型并且可以以“每个表的类”方式映射,Linq2SQL 是一个很好的 ORM。

对于断开连接的更改跟踪(如果要进行 n 层,您将需要它)其他 ORM 有更好的支持。

最后:

(我们来自经典的 ASP,所以这对我们来说是一大步)

在这种情况下,我会特别小心。交换技术经常被低估。即使是团队中最聪明的程序员也会做出错误的决定,因为他们缺乏技术经验。尽管如此,重要的是要走新路并提高您的技能。那些从不失败的人永远不会成功。

于 2009-12-29T16:46:32.747 回答
2

我会说 L2SDAL。不同类中的 L2S + 业务逻辑成为合并的 DAL+BLL,DAL 端是 L2S 运行时,以及 L2S 生成的代码(数据上下文、实体类等)。

您仍然可以轻松地将它们分开,以便 L2S 生成的部分以及对实体和数据上下文的任何扩展都位于单独的 DLL 中,而其他业务逻辑则位于单独的 dll/service/etc 中。然而,在许多情况下,并没有真正需要将它们分开。

使用 L2S 时分离为 DAL+BLL 的一个原因是,如果您预见到将来您将转向另一种数据访问技术,或者您可能会使用多种数据访问技术。拥有一个单独的 DAL 与任何 L2S 特定的东西分开应该可以更容易地切换出 DAL。如果出于这个原因想要分离 DAL+BLL,L2S DAL-DLL 应该公开实体类、任何派生类或投影类以及获取实体或集合(列表等)的方法,但将 DataContext 保留在 DAL 内部类以避免 L2S 特定的东西(L2S 查询等)流入 BLL。

JMHO。


由于其他人提到了 L2S 工具,这里有一个更完整的总结:http ://www.thinqlinq.com/post.aspx/title/linq-tools

于 2009-12-30T02:25:58.783 回答
0

恕我直言,LINQ to SQL 是目前可用的最佳选择。它确实使处理数据变得轻松而有趣。:-) 如果您对 LINQ to SQL 感兴趣,我会看看我们的PLINQO项目。它对 LINQ to SQL 进行了一些重大改进,使其成为更好的整体解决方案。

于 2009-12-29T23:17:22.127 回答
0

I think with linq the DAL and BLL concepts are no longer meaningful. So I placed linq classes and some getters & setters under the 'Domain' folder under the Code (parent) folder. Then I created 'Repository' classes and 'FontEnd' classes.

于 2010-09-19T17:57:32.927 回答