在单独的数据访问和业务逻辑层中,我可以在业务层中使用实体框架类吗?

Posted

技术标签:

【中文标题】在单独的数据访问和业务逻辑层中,我可以在业务层中使用实体框架类吗?【英文标题】:In separate data access & business logic layer, can I use Entity framework classes in business layer? 【发布时间】:2011-02-19 23:53:53 【问题描述】:

在单独的数据访问和业务逻辑层,我可以在业务层使用实体框架类吗?

编辑:我认为将来我不需要从我的业务逻辑中换出数据访问层(即将是 SQL Server),但是我会换掉 UI 层。因此,问题更多的是在业务层为我使用 EF 类是否存在任何重大问题?似乎管道代码会更少。

【问题讨论】:

我真的很想听到更多关于这个主题的信息。我很想看到 TomTom 解释他将如何处理它。 【参考方案1】:

通常,“最佳实践”方法是这样的:

在您的数据层中,您拥有从数据库加载和存储回数据库的 EF 实体

在您的业务层中,您有自己的域对象(只是普通的 C# 类),它们代表您的应用程序需要处理的数据。它们可能或多或少与数据层实体相同,或者它们可以包含几个“原子”实体来组成一个业务对象,或者它们可能大不相同。为了减少对大量左右赋值语句的需求(在数据层实体和业务层对象之间来回移动属性值),您应该查看像 AutoMapper 这样的工具,它真的很容易在相似的对象类型之间设置“映射”并允许您轻松地来回分配这些类型

然后,您的 UI 层将可视化并将业务层对象呈现给用户,以获取信息和/或操作

好处是您的业务层域模型代表您正在使用的实际业务对象,并且或多或少独立于这些对象在数据层中的实际存储方式。此外,这还避免了将您的 UI 层“粘合”到特定的数据访问技术。

当然 - 这是企业级应用程序的推荐最佳做法,您可能需要更换数据访问层等。对于更简单的应用程序,您可能会跳过这些做法,知道你在做什么,并且如果你一直使用 EF 实体通过业务层进入 UI,那么你就是在将自己“锁定”到 EF 中。如果这对您和您的应用场景来说没问题 - 没有特别的理由不这样做。 EF 实体是完全有效的 .NET 对象类——它们只是从一个公共基类(EntityObject 而不是object)派生而来,并且伴随着一定数量的“包袱”。但是没有什么能阻止您在整个应用程序中使用这些 EF 实体。

【讨论】:

最佳实践会让你在任何面向对象的团队中被解雇。数据层是实体框架运行时 - 而不是您的业务对象。正确编码的实体对象存在于业务层中。 TomTom - 当您说实体对象时,您的意思是“实体框架对象”吗?您的意思是您应该在 EF 设计器中构建您的域模型并将这些称为业务对象,然后使用 EF 将这些映射到数据库表。 @TomTom - 你会如何处理它? 【参考方案2】:

与所有此类性质的问题一样,答案视情况而定。如果您想清楚地分离数据访问逻辑和业务层,我会拒绝。如果这是您的目标,我将使用存储库模式和 IoC 来构建数据访问层,那么您可以交换存根 DAL 以进行单元测试,然后在进行功能测试时引入数据库访问。

【讨论】:

【参考方案3】:

如果您需要能够更改访问数据库的方式而无需重写大量代码,则最好将 EF 排除在业务层之外。您可以使用工作单元和存储库模式来实现这一点;通过接口访问数据层的所有功能。 如果删除 EF,接口保持不变,您只需更改实现类。

但是,不使用 UoW 和存储库的论据,主要是 DbContext 已经为您提供了许多这些功能。

我开始了一个项目,在数据层有一个 UoI 和存储库,而在业务层没有 EF 引用。随着我的进步,我觉得我只是在为自己工作,所以放弃了它们。相反,我使用从业务层访问上下文,执行从 DTO 到业务层 POCO 的任何转换。

在我的情况下,我有信心坚持使用 EF。如果不是,请考虑哪种方法适合您。

【讨论】:

以上是关于在单独的数据访问和业务逻辑层中,我可以在业务层中使用实体框架类吗?的主要内容,如果未能解决你的问题,请参考以下文章

N 层服务层验证显示表示层中的业务逻辑错误

业务层设计——如何定义规则

使用分层实现业务处理

Java Server Faces:仅在业务逻辑层中进行验证

使用三层架构处理业务

由 dbml 形成的数据访问层中的功能