我已经开始了一项新工作,我们正在将一个相当大的VB.NET 2.0应用程序(带有数据集)迁移到C#4.5(使用EF4。)
从我们的业务层,我们的“搜索”功能现在返回我们的EDMX中定义的类的IEnumebles。所以这样的事情很简单:
public IEnumerable<Product> GetProductsByCategory(int categoryId)
但是当我们的EF4“Select()”方法产生更复杂的自定义(匿名)类型时,它会更复杂:没有与结果对应的生成类。
因为这个函数必须越过层边界(Business到UI),我认为适当的解决方案是为这个查询定义一个自定义类型,然后返回该类型的IEnumerable; e.g。
public IEnumerable<ProductAccountSummary> GetProductAccountSummariesByCategory(int categoryId)
其中ProductAccountSummary
是手工制作的DTO(即POCO)。
然而,在代码审查期间,团队负责人未能通过我的方法;他要我删除DTO并将方法签名更改为:
public IEnumerable GetProductAccountSummariesByCategory(int categoryId)
....原因是我们仍然可以将IEnumerable绑定到我们的UI网格等,而不需要每次我们需要使用自定义类型时手工制作DTO的开销。
所以我的问题是:
答案 0 :(得分:4)
我认为你的团队领导是完全错误的。处理强类型对象通常被视为处理事物的方式。使用这种方法,您又回到了再次使用数据集等类型的世界。当开始需要修改对象并将其传递回业务层时,将会出现长期维护问题。即使没有任何东西需要返回到业务层,客户端也会出现维护问题。
是的,创建DTO会产生开销,但短期速度不应成为最终长期维护问题的原因。