在使用实体框架时,POCO是正确的选择吗?

时间:2012-04-12 07:09:34

标签: c# .net entity-framework poco

我一直在阅读关于POCO(普通旧CLR对象)的一段时间,但仍然无法找到使用它而不是使用实体框架的自动生成的部分类的真正附加价值? 还有一件事是最好直接从表示层使用我的实体框架,还是创建BLL会更好?

3 个答案:

答案 0 :(得分:10)

POCO的主要好处是你可以把它传递给一个类,库或程序集,它不需要知道有关Entity Framework的任何信息来完成它的工作。

记住单一责任原则 - 您的DAL应该知道EF,但您的域名不应该,而且您的表示层也不应该,因为EF处理数据访问而这些层不处理。将EF生成的类对象传递到这些层通常意味着您需要使这些层知道EF,破坏SRP并使单独测试这些层变得更加困难。

为了回应阿里在下面评论中的进一步询问,这里有一个扩展的解释。

在更复杂的应用程序中,您需要将逻辑拆分为单独的问题 - 数据访问,业务逻辑,演示(可能还有更多)。

当实体框架处理数据访问时,它驻留在数据访问层中 - 在这里,您将看到POCO和EF生成的类之间几乎没有区别。这很好,因为该层已经了解了Entity Framework。

但是,您可能希望将数据传递到业务逻辑层 - 如果您使用EF生成的类执行此操作,那么您的业务逻辑层也必须了解实体框架,因为EF类依赖于EF提供的大量内容特别。这样做是为了消除业务逻辑层应该具有的隔离 - 您需要这种隔离,这样您就可以通过从虚假数据访问层将已知数据注入到类中来正确地对其进行单元测试,如果您让这个非常难以做到业务逻辑层了解EF。

通过单元测试,您应该测试图层功能,而不是第三方库的功能 - 但是使用EF,您最终会测试很多EF的功能,或者您自己的功能非常依赖于EF的功能。这不好,它可以掩盖错误或问题。

删除对EF生成的类的业务逻辑依赖性还允许您从数据访问层将图层移动到远程位置 - 您甚至可以将其粘贴在Web服务之后,它将非常高兴。但是你只能用POCO来做这件事,你不能用EF生成的类来做这件事。

POCO在大型复杂的多层应用程序中真正发挥作用 - 如果你没有对应用程序进行分层,那么你就不会看到一大堆好处。

所有这些都是我的观点,我只是一个有经验的编码员 - 我不是编码摇滚明星,所以其他一些评论者可能希望进一步扩展我的答案......

答案 1 :(得分:1)

POCO的真正好处是您可以先使用代码和EF迁移。如果您不打算首先使用代码,则可以使用设计器生成的类。

如果您有一个大型应用程序,您应该创建一个单独的BLL,但如果您的应用程序非常小,您可以直接使用表示层中的EF类。

答案 2 :(得分:1)

在ORM中使用POCO类允许您以更简单的方式为该代码创建测试。它还允许您在模型对象(PO​​CO类)和数据访问代码之间进行抽象层,因此如果需要,您可以交换数据访问代码(例如,用于NHibernate的EF)。

我过去曾使用POCO模型,我可以告诉你,它对于大型企业项目和大型开发团队非常有用,其中模型的更改经常发生,并且EF默认使用的整体文件模型不规模。很难看到小项目或快速应用程序开发的好处。

TLDR版本:如果您问自己POCO和代码的优点是什么,您可能无法获得使用它们。