关于c#:使用Linq To SQL和DTO分离关注点

关于c#:使用Linq To SQL和DTO分离关注点

Separating concerns with Linq To SQL and DTO's

我最近开始了一个新的Webforms项目,并决定将业务类与任何DBML引用分开。 我的业务层类将访问离散的数据层方法,并返回DTO的集合。 因此,数据层可能会像下面这样投影DTO:

1
2
3
4
5
6
7
8
(from c in dataContext.Customers
where c.Active == true
select new DTO.Customer
{
   CustomerID = c.CustomerID,
   Name = c.CustomerName,
   ...
}).ToList()

尽管构建DTO对象会增加工作量,但这似乎是一种更好的方法来紧密绑定业务与数据层,这意味着我可以在不存在数据库的情况下测试业务层。

我的问题是,这是一种好的做法吗?有没有一种生成DTO的方法(可能通过SQLMetal),以及随着项目的进行我还会遇到什么其他问题?


我不知道这是否是最佳实践,但我在不久前就编写了类似的代码,因为我也感到可以通过在应用程序中使用自己的类而不是LINQ-designer生成的类来改善关注点的分离。

您可能需要考虑仅从数据访问方法返回IQueryable 而不是IList 。由于IQueryable < T >继承自IEnumerable < T >,因此您的其他应用程序应该能够很好地处理它。您也可以在需要时将其转换为列表。

这样做的好处是,您可以轻松地动态修改查询,并最大程度地减少从SQL Server返回的数据量。

例如。如果您的方法签名是
IQueryable GetCustomers(),您可以通过调用GetCustomers()获得单个客户。where(c => c.CustomerID == 101).Single();

在此示例中,数据库中仅返回一条记录,而我想象当前您的代码将返回所有客户,或者您将需要编写单独的方法(因此是非常重复的代码)来满足您可能需要的所有不同内容过滤。


在我看来,在大多数情况下,处理LINQ不需要DTO对象。生成的LINQ类可以很容易地进行测试。 LINQ使您能够使用相同的查询来查询来自不同来源的数据。它使您能够针对对象列表而不是实际数据库测试查询。


推荐阅读