用 Linq To SQL 和 DTO 分离关注点
Posted
技术标签:
【中文标题】用 Linq To SQL 和 DTO 分离关注点【英文标题】:Separating concerns with Linq To SQL and DTO's 【发布时间】:2010-09-08 05:56:45 【问题描述】:我最近开始了一个新的网络表单项目,并决定将业务类与任何 DBML 引用分开。我的业务层类改为访问离散的数据层方法,并返回 DTO 的集合。所以数据层可能会像下面这样投射 DTO:
(from c in dataContext.Customers
where c.Active == true
select new DTO.Customer
CustomerID = c.CustomerID,
Name = c.CustomerName,
...
).ToList()
虽然构建 DTO 对象会增加工作量,但这感觉像是在业务层和数据层之间紧密绑定的更好方法,并且意味着我可以在没有数据库的情况下测试业务层。
我的问题是,这是一种好的做法吗?,有没有一种方法可以生成 DTO(可能通过 SQLMetal),以及随着项目的进展我可能会遇到什么其他问题。
【问题讨论】:
我在这里发布了一些关于外部 XML 映射的链接:***.com/questions/988872/linq-to-sql-external-mapping/… 【参考方案1】:我不知道这是否是最佳实践,但我在不久前编写了类似的代码,因为我也觉得我可以通过使用自己的类而不是 LINQ 设计器生成的类来改进关注点分离在我的应用程序中。
您可能需要考虑仅从数据访问方法返回 IQueryable
这样做的好处是您可以很容易地动态修改查询并最大限度地减少从 SQL Server 返回的数据量。
例如如果您的方法签名是
IQueryable
在此示例中,只会从数据库返回一条记录,而我想目前您的代码将返回所有客户,或者您需要编写单独的方法(因此是非常重复的代码)来满足所有不同的需求你可能想要过滤。
【讨论】:
我建议完全相反。我永远不会通过 DAL 之外的 IList 返回 IQuerable。如果这样做,那么您的表示层可能最终会无意中执行数据库查询,或者您最终可能会混合 Linq-to-objects 调用并获得 Linq-to-sql 错误。从 Linq-to-sql 中返回 IQuerable 会导致架构非常糟糕和泄漏,应该避免用于除了最时髦的玩具应用程序之外的所有应用程序。【参考方案2】:在我看来,在大多数情况下处理 LINQ 时不需要 DTO 对象。生成的 LINQ 类可以轻松测试。 LINQ 使您能够使用相同的查询来查询来自不同来源的数据。它使您能够针对对象列表而不是真实数据库来测试您的查询。
【讨论】:
同意。从本质上讲,您的 Linq-to-sql 对象可以被视为 DTO,甚至还有一个 T4 模板可以将您的 L2S 对象生成为可序列化的。以上是关于用 Linq To SQL 和 DTO 分离关注点的主要内容,如果未能解决你的问题,请参考以下文章