【问题标题】:Why EF Entities are making a dependency and the need of POCO为什么 EF 实体会产生依赖关系以及 POCO 的需求
【发布时间】:2012-01-26 17:46:48
【问题描述】:

我对 IoC、依赖注入和单元测试还很陌生。我正在开始一个新的宠物项目,我正在努力做好。

我打算使用存储库模式来调解数据。我要从存储库返回的对象将是从 Linq 到实体数据上下文 (EF4) 收集的对象。

我在 Mark Seeman 的“依赖注入”中读到,这样做会产生重要的依赖关系,并且肯定会使测试复杂化(这就是他在库项目中使用 POCO 对象的原因)。

我不明白为什么。尽管对象是由 linq to entity 上下文创建的,但我可以简单地调用构造函数来创建它们,因为它们是普通对象。所以我认为可以创建虚假的存储库,将这些对象向调用者发送。

我也关心POCO类的自动生成,不是很容易。

有人可以带来一些光明吗? POCO 对象对于解耦和可测试的项目真的是必需的吗?

**编辑:感谢 Yuck,我明白最好避免使用模板自动生成,这让我想到了一个设计问题。如果我来自一个大型遗留数据库,他的表承担着各种职责(与具有单一职责的类的概念不太吻合),那么最好的处理方法是什么? p>

不能删除数据库 ;-)

【问题讨论】:

    标签: c# entity-framework-4 poco


    【解决方案1】:

    不,它们不是必需的,它只是让事情变得更容易、更干净。

    POCO 库不知道实体框架正在使用它。这允许它以其他方式使用 - 例如,代替视图模型。它还允许您在 WCF 服务的两端使用相同的项目,从而无需创建数据传输对象 (DTO)。

    只是个人经验中的两个例子,但肯定还有更多。一般来说,较少特定对象或代码片段知道谁在使用它或它是如何使用的,这将使它更多适应其他情况并通用。

    您还提到了POCO 类的自动生成。我不建议这样做。您是否打算从您的数据库结构中生成类定义?

    【讨论】:

    • 感谢您抽出宝贵时间。这对我来说很有价值。我想澄清一下 POCO 类的生成。虽然这是一个宠物项目,但我来自数据库结构(我有兴趣学习最好的方法)。类的自动生成可以节省时间,并且在遗留项目中可以帮助轻松地表示大数据资产。无论如何,我知道最好避免使用模板自动生成。当您必须导入相当大的表时,最好的做法是什么?
    • @user1171844 我的意思是,您当然可以通过从您的数据库结构生成它们来开始。但是 EF 提供的部分好处是允许您定义与 db 模式 1:1 不匹配的类。所以你可以拆分表,组合相关实体等等。在您完成 POCO 项目时请记住这一点。
    【解决方案2】:

    我打算使用存储库模式来调解数据。 我要从存储库返回的对象是 将是从 Linq 收集的对象到实体数据上下文 (EF4)。

    EF 生成的默认类(不是 POCO)包含延迟加载的代理,并与实体框架绑定。这意味着任何其他想要使用这些类的类都必须引用所需的 EF 程序集。

    这就是 Mark Seeman 所说的依赖关系。由于您现在依赖于这些非抽象类型,而这些非抽象类型又依赖于 EF,因此您不能简单地将存储库的实现更改为不同的东西(即仅使用您自己的持久性存储)而不解决依赖的类中的这种更改关于这些类型。

    如果您真的只对 EF 生成类型的公共属性感兴趣,那么您可以让 EF 生成的部分类实现基接口。将您需要的所有属性放入该基本接口中,并将依赖项作为基本接口传入 - 现在您只依赖基本接口,不再依赖 EF。

    【讨论】:

    • 非常感谢 ;)。延迟加载这是我遗漏的一个重要细节。
    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2012-06-21
    • 2013-01-04
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多