Asp.Net 与 EF 更好的项目结构

Posted

技术标签:

【中文标题】Asp.Net 与 EF 更好的项目结构【英文标题】:Asp.Net with EF better structure of project 【发布时间】:2020-04-29 12:28:40 【问题描述】:

在创建带有数据库的 ASP.Net MVC 项目时,是否可以在开始时创建一个 DAL 类库,其中有模型类和对数据库的访问权限,然后将此库添加到 Web 项目中?在 Models 文件夹中的 Web 项目中编写实体是否更好? 我想先创建 EF 代码

【问题讨论】:

这是一个见仁见智的问题,但我认为你应该以最简单的方式开始。以后可以随时重构。 【参考方案1】:

我将我的实体、DbContext(s) 和存储库类放在一个单独的程序集(域)中,并从我的 Web 应用程序中引用它们。如果它是一个足够小的应用程序,那么 Web 应用程序中的域文件夹肯定足够分离。这完全是为了组织。

我不建议尝试将所有内容都从实体框架中抽象出来。这涉及到许多相对复杂的代码,或者它牺牲了 EF 可以为您的项目提供的性能和功能。

例如,在我的例子中,Web 项目和域程序集都将包含对 EF 的引用。这是因为我的存储库类在其方法中返回 IQueryable<TEntity>,并且我的控制器还负责绑定 DbContext 的工作单元。为了利用这一点,Web 项目将需要对 EF 的引用。我已经看到无数次尝试将 EF 抽象出来,以便 Web 项目不需要引用实体框架。恕我直言,这是对复杂代码的巨大浪费,或者牺牲了很多 EF 可以为项目做的事情。例如,您可以引入复杂的参数(例如Func<Expression<T>>)来执行过滤,然后还需要担心排序表达式、分页、预加载等。或者您取消了能够减少基于 EF 查询的灵活性和性能通过让您的域程序集类(服务或存储库)返回 DTO 或分离实体来满足环境的需要。这会导致大量样板代码和/或严重的性能缺陷。

因此,简而言之,在考虑是否将功能分解为单独的程序集时,重要的是要了解想要这样做的原因。总的来说,以简单为目标是我能给出的最佳建议。

【讨论】:

以上是关于Asp.Net 与 EF 更好的项目结构的主要内容,如果未能解决你的问题,请参考以下文章

依赖反转原则DIP 与 使用了Repository的asp.net core 项目结构

ASP.NET 解决方案的典型结构?

Asp.net WebApi + EF 单元测试架构 DbContext一站到底

ASP.NET WebForm项目结构

托管在服务结构上的 ASP.Net 核心项目未启动

ASP.NET MVC 中的项目布局和站点结构