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

时间:2010-05-16 00:29:42

标签: c# entity-framework business-logic data-access-layer

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

编辑:我认为将来我不需要从我的业务逻辑中换出数据访问层(即将是SQL Server),但是我将用于UI层。因此,问题更多的是在业务层中为我使用EF类有什么主要问题吗?好像管道代码会少一些。

3 个答案:

答案 0 :(得分:16)

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

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

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

  • 然后,您的UI图层将可视化并向用户显示业务层对象以获取信息和/或操作

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

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

答案 1 :(得分:1)

与所有这种性质的问题一样,答案取决于它。如果您想要清楚地分离数据访问逻辑和业务层,我会说不。如果这是你的目标,我将使用存储库模式和IoC来构建数据访问层,那么你可以交换存根DAL进行单元测试,然后在进行功能测试时引入数据库访问。 / p>

答案 2 :(得分:0)

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

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

我在数据层启动了一个带有UoI和存储库的项目,并且在业务层没有EF引用。随着我的进步,我觉得我只是为自己做工,然后放弃了。相反,我使用从业务层访问上下文,执行从DTO到业务层POCO所需的任何转换。

在我的场景中,我有信心坚持使用EF。如果不是,请考虑适合您的方法。