4

我已经开始了一项新工作,我们将一个相当大的VB.NET 2.0应用程序(带数据集)迁移到C#4.5(使用EF4)。现在返回在我们的EDMX中定义的类的IEnumerables。因此,像这样很简单:EF4 complex Select():从Business Tier返回IEnumerable或IEnumerable <MyCustomDto>?

public IEnumerable<Product> GetProductsByCategory(int categoryId) 

但它更复杂,当我们EF4“选择()”方法产生更复杂的,定制的(匿名)类型:有对应的结果没有生成的类。因为这个函数必须跨越层边界(Business to UI),所以我认为适当的解决方案是为这个查询定义一个自定义类型,然后返回该类型的IEnumerable;例如

public IEnumerable<ProductAccountSummary> GetProductAccountSummariesByCategory(int categoryId) 

其中ProductAccountSummary是手工制作的DTO(即POCO)。

但是,在代码审查期间,团队领导失败了我的方法;他要求我删除DTO,改变方法签名:

public IEnumerable GetProductAccountSummariesByCategory(int categoryId) 

....原因是,我们仍然可以绑定了IEnumerable我们的UI电网等无开销的手工制作一个DTO每次我们需要使用自定义类型时。

所以我的问题是:

  • 在EF4,什么是跨层边界传递自定义类型的集合典型的做法?返回一个IEnumerable(隐式地,“对象”)对我来说看起来并不正确。我错过了什么吗?
+0

不错的问题。我总是在应用程序层之间使用DTO。不知道为什么有人会选择非泛型'IEnumerable'。 – nrodic

+0

“-1”没有评论?苛刻!必须是我的团队主管:) – Merenzo

回答

4

我认为你的团队领导是完全错误的。处理强类型对象通常被视为做事情的方式。使用这种方法,您又回到了处理诸如数据集类型的世界。当开始需要修改对象并将其传回业务层时,将会出现长期维护头痛的问题。即使不需要返回到业务层,甚至会在客户端出现维护头痛的问题。

是的,在创建DTO时存在开销,但短期速度不应该成为最终长期维护问题的原因。

相关问题