5

我正在开发一个将使用 LINQ to SQL 的个人项目(C#/ASP.NET)。该解决方案将(到目前为止)有一个 Webform 项目、一个 Namespace 项目(业务逻辑)和一个 Tests 项目。到目前为止,我处于非常早期的阶段(显然处于设计阶段)。

这里有 3 层架构的范例吗?在这种情况下,DAL 似乎完全没用;感觉我应该直接从业务逻辑执行 LINQ 查询。

我还想到,如果我只保留一个常驻 DataContext 并传递它,我只需要一个打开的连接。这将有一个额外的好处,即一次而不是细粒度地提交更改。对此有什么想法吗?

我找到了这个线程,但它似乎描绘了一幅不完整的画面。有没有关于这个主题的深入文章?

4

4 回答 4

6

你可以阅读一下领域驱动设计。

通过领域驱动设计 (DDD) 的实践,您拥有了一个丰富的“领域模型”,您可以在其中表达您想要解决的问题领域。此域模型由您用来建模业务实体的类(和结构)组成。域模型还包含存储库。
存储库是您在域模型(和应用程序)中使用的某种抽象;存储库是数据存储的抽象。通过存储库,您可以检索实体,并且您可以使用存储库来持久化实体。

在您的情况下,您的存储库可以在内部使用 Linq To SQL 与数据库通信。但是请注意,您的存储库不应该负责管理(打开/关闭)连接和事务(启动/提交/回滚)。为什么 ?-> 因为存储库不知道或不知道使用它的上下文。应该是您的应用程序或服务层(使用您的域模型并因此使用您的存储库的层)负责打开新连接并启动/提交事务。(或者在您的情况下,打开一个新的 DataContext)。然后,您可以将 DataContext 传递到存储库。

(Eric Evans 有一本关于 DDD 的好书,尽管有时很难破解)。

于 2009-01-26T21:52:45.040 回答
4

您可以将 LINQ-to-SQL 视为您的 DAL,因此“直接从业务逻辑”使用它不一定是坏事。

http://dotnetlog.com/archive/2008/03/18/best-practice-and-effective-way-of-using-datacontext-in-linq.aspx列出了一些流行的 L2S 方法。

在我们的项目中,我们不想传递数据上下文,因此我们使用了类似于上面链接中的#3 的模式(Ambient DataContext,见下文)。它有一些问题,但效果还不错;至少对于我们的网络项目。

环境数据上下文(当前使用这个)

环境数据上下文背后的想法是,一旦第一次调用 DataContext,就会为特定线程或 httpcontext(在 asp.net 中)创建上下文。然后相同的上下文用于该线程或请求,除非它是手动处理的。这是通过将上下文存储在请求/线程数据存储中来完成的。此模式的方法类似于静态 DataContext,但是为每个线程和请求提供了分离。这在 Asp.Net 中运行得非常好,然而,它再次受到静态上下文的一些问题的困扰。

这种模式的问题:

* The context is available for manipulation at any level. And quickly becomes very hard to maintain unit of work
* Portability across thread is very hard
* Unit of work pattern is not transparent enough
于 2009-01-26T21:59:23.950 回答
1

你应该小心你的术语。当您说 LINQ 时,您的意思是 Linq-to-sql,而当您说 3 层时,这通常意味着您正在谈论具有 3 台独立机器的部署方案。我不确定这是否是你的意思。

在使用像 linq-to-sql 这样的 ORM 工具时,三层架构仍然是一个好主意。DAL 只是一个存储查询逻辑的地方。将查询从业务层中取出是个好主意,因为查询是持久性问题,而不是业务逻辑问题。

管理数据上下文的常用技术是每个请求都有一个数据上下文。

关于该主题的其他文章,您可以查看任何 ORM 工具的任何架构指南 - linq-to-sql 也不例外。查找有关 NHibernate 架构的文章。

于 2009-01-26T21:55:47.390 回答
0

在这种情况下,LINQ to SQL 库是您的 DAL,而不是从您的业务层(例如 DAL.GetObjectById(id))进行传统的 API 调用,您可以灵活地向 DAL 中提出更具表现力的请求。

如果您有其他需求,例如您自己的连接到非 MSSQL 数据支持的 LINQ 提供程序,那么您将实现自己的 DAL。

此外,关于 DataContext,不建议使用带有“一个驻留 DataContext”的单例模式。DataContext 对象应该代表单个逻辑事务,无论这对您的应用程序意味着什么。(转述自http://weblogs.asp.net/despos/archive/2008/03/19/more-on-datacontext-in-hopefully-a-realistic-world.aspx

于 2009-01-26T21:52:57.710 回答