如果Entity Framework / DbContext是DAL / Repository,它在哪里适合3层架构?

我一直在阅读StackOverflow和其他网站关于最佳架构实践的文章,并且有很多相互矛盾的想法和意见。

我最终确定了一种方法,但我很难确定放置EF对象的位置(DbContext,Fluent API,种子数据等)。 这是我目前拥有的:

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

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

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

所以问题是,在这种配置中,EF类会去哪里? 最初我想在服​​务层,但这似乎没有意义。 然后我想把它们放在域模型层中,但是它将域模型绑定到EF,它本质上是一个DAL / Repository。 最后,我考虑为EF创建一个单独的DAL项目,但考虑到它可能有3-4个文件(DbContext和一些其他小文件),这似乎是一个巨大的浪费。

有人可以提供任何指导吗?

不需要域模型,因为它将是冗余。 EF类可以直接充当域模型,并在将其发送到View时将它们转换为View Models。 EF可以分成不同的类库。 他们中的大多数使用存储库模式以及任何ORM,如果他们要替换它们将很容易。 但我看到批评使用存储库模式,检查出来。

这是我做的:

数据:

  • 有一个类inheritance自DbContext。
    • 它有所有数据库集。
    • 覆盖OnModelCreating。
    • 映射主键和关系。

实体:

  • 有每个POCO课程。
    • 每个属性都装饰有所需的数据注释。

服务:

  • 每个服务都有公共方法(GetList(),Find(),Create()等)。

商业:

  • 从客户端调用,使用服务协调执行特定任务UserChangePassword(这将检查是否可以执行此操作,然后执行任务,或返回错误/未授权状态以使客户端显示有关任务的正确信息。 在我的情况下是我记录的地方。

客户端(桌面/ Web / Wpf /等)。

我不是说这是最好的方法,我只是分享一直在为我工作的东西。