C# 如果Entity Framework/DbContext是DAL/Repository,那么它在3层体系结构中的位置如何?

C# 如果Entity Framework/DbContext是DAL/Repository,那么它在3层体系结构中的位置如何?,c#,asp.net,.net,asp.net-mvc,entity-framework,C#,Asp.net,.net,Asp.net Mvc,Entity Framework,我整天都在读StackOverflow和其他网站上关于最佳架构实践的文章,但是有太多相互矛盾的想法和观点 我最终确定了一种方法,但我很难决定将EF对象(DbContext、Fluent API、种子数据等)放置在何处。以下是我目前拥有的: ASP.NET MVC项目:实际的web项目。包含标准视图、控制器和视图模型(在“模型”文件夹中) 域模型项目:包含定义数据库(域)对象的所有POCO类。目前,未提及或引用任何EF对象 服务层项目:包含每种域对象类型的服务对象(例如IPProductServi

我整天都在读StackOverflow和其他网站上关于最佳架构实践的文章,但是有太多相互矛盾的想法和观点

我最终确定了一种方法,但我很难决定将EF对象(DbContext、Fluent API、种子数据等)放置在何处。以下是我目前拥有的:

ASP.NET MVC项目:实际的web项目。包含标准视图、控制器和视图模型(在“模型”文件夹中)

域模型项目:包含定义数据库(域)对象的所有POCO类。目前,未提及或引用任何EF对象

服务层项目:包含每种域对象类型的服务对象(例如IPProductService、IOrderService等)。每个服务都引用像dbset这样的EF对象并处理业务规则,例如,添加产品、获取产品、将产品附加到订单等

所以问题是,在这个配置中,EF类去哪里?起初我认为是在服务层,但这似乎没有什么意义。然后我想把它们放在域模型层,但是它将域模型与EF联系起来,EF本质上是一个DAL/存储库。最后,我考虑只为EF创建一个单独的DAL项目,但考虑到其中可能包含3-4个文件(DbContext和其他一些小文件),这似乎是一个巨大的浪费


有人能提供指导吗?

不需要域模型,因为它是冗余的。EF类可以直接充当域模型,并在将其发送到视图时转换为视图模型。EF可以分为不同的类库。他们中的大多数人在使用任何ORM的同时使用存储库模式,以防进行替换会很容易。但我看到了对使用存储库模式的批评,请查看。

以下是我的工作:

数据:

  • 有一个类继承自DbContext。
    • 它拥有所有的数据库集
    • 重写模型创建
    • 映射主键和关系
实体:

  • 有每一个POCO类。
    • 每个属性都用所需的数据注释进行修饰
服务:

  • 每个服务都有公共方法(GetList()、Find()、Create()等)
业务:

  • 从客户端调用,使用服务协调以执行特定任务UserChangePassword(这将检查是否可以执行,然后执行任务,或返回错误/未授权状态以及其他许多状态,以使客户端显示有关任务的正确信息。在我的案例中,这是我记录的地方
客户端(桌面/Web/Wpf/etc)


我并不是说这是最好的方法,我只是在分享我一直在做的事情。

我先使用EF代码,所以我自己创建POCO类。然而,我的印象是我的域模型应该是纯POCO类,EF DbContext等人应该住在其他地方。这不对吗?就像Sunny所说的那样——带上你的POC在解决方案中创建一个新项目,该项目只包含POCO类(而不是DbContext)…该程序集可以非常轻,并且不需要依赖于EF。.您的DbContext将放在WPF/WinForm/WebForm/MVC/Silverlight/任何依赖于EF的程序集中。这是最好的方法,也是您通常看到Microsoft在首先显示EF代码时演示的方法。@DerekCurtis:问题是如果我将B上下文在MVC项目中,那么服务层需要引用MVC项目,MVC项目也需要引用服务层。似乎是循环引用?如果您想使用服务层,那么dbcontext相关的代码将在服务中。DAL将包含EF、IUow等。POCO可以存在于不同的库或DAL中不同命名空间下的ayer。在服务和MVC应用程序中引用它。但服务层类似于不需要的存储库模式,您可以在这里直接使用EF,而不会出现任何单元测试问题。检查@Sunny:如果我理解正确,您是说有MVC项目、POCO项目,就这样?您是说服务yer不是必需的,但是让MVC控制器直接访问EF并执行直接查询不是很糟糕吗?这就是为什么我考虑使用服务层项目,以便控制器可以引用iSeries来处理EF查询和业务规则。想法?是什么驱使你创建三个项目,而不是just one?更好的可扩展性。通过一个单独的域模型项目和一个服务项目,您可以拥有另一个应用程序(例如,WinForms应用程序)这可以轻松地使用域和业务逻辑,而无需复制代码。此外,如果有WinForms应用程序和MVC应用程序,则业务规则更改等操作只需在一个位置进行,而不需要在两个位置进行。