我最近开始了一个新的webforms项目,并决定将业务类与任何DBML引用分开。我的业务层类代替访问离散的数据层方法,并且是DTO的返回集合。因此,数据层可能会像以下一样投影DTO:
(from c in dataContext.Customers
where c.Active == true
select new DTO.Customer
{
CustomerID = c.CustomerID,
Name = c.CustomerName,
...
}).ToList()
尽管构建DTO对象增加了工作量,但这对于Business& S之间的紧密绑定感觉更好。数据层和方法我可以在没有数据库存在的情况下测试业务层。
我的问题是,这是一个好的做法吗?有没有办法生成DTO(可能是通过SQLMetal),以及随着项目的进展可能会遇到的其他问题。
答案 0 :(得分:5)
我不知道这是不是最好的做法,但我在最近的一段时间里写过类似的代码,因为我觉得我可以通过使用自己的类而不是LINQ设计器生成的类来改善关注点的分离在我的申请中。
您可能需要考虑返回IQueryable< Customer>而不是IList< Customer>来自您的数据访问方法。由于IQueryable< T>继承自IEnumerable< T>你的应用程序的其余部分应该能够很好地处理它。您还可以在需要时将其转换为List。
这样做的好处是,您可以非常轻松地动态修改查询,并最大限度地减少从SQL Server返回的数据量。
E.g。如果您的方法签名是 IQueryable的<客户和GT; GetCustomers()您可以通过调用GetCustomers()获得单个客户。其中(c => c.CustomerID == 101).Single();
在这个例子中,只有一条记录会从数据库中返回,而我想现在你的代码会返回所有客户,或者你需要编写单独的方法(因而是非常重复的代码)来满足所有不同的东西你可能想过滤。
答案 1 :(得分:2)
在我看来,在大多数情况下,处理LINQ时不需要DTO对象。生成的LINQ类可以轻松测试。 LINQ使您能够使用相同的查询从不同的源查询数据。它使您能够针对对象列表而不是真正的数据库测试您的查询。