如何使用 EF Core 代码首次迁移为 ASP.NET Core MVC 配置 N 层架构

How to configure N-tier architecture for ASP.NET Core MVC with EF Core code first migrations

如果我的某些逻辑有缺陷,我深表歉意,因为我是 ASP.NET Core 中中等规模应用程序开发的新手。我正在使用 Entity Framework 核心(代码优先)和 ASP.NET 核心 5 MVC,并希望能够将我的项目分成 3 个不同的层:

  1. 数据层(数据访问层)

这将包含迁移,ApplicationDbContext 和代表我程序中实体的 POCO。

  1. 服务层级

这将包含用于从数据层访问数据的接口及其具体实现。

// For example
public UserService : IUserService
{
   public async Task<IEnumerable<User>> GetAllUsers()
   {
      // ApplicationDbContext injected in constructor and stored in readonly _context variable
      await _context.Users.ToListAsync();
   }
}
  1. 表示层(ASP.NET 核心 MVC UI)

这将包含典型的 MVC 内容,例如视图模型、控制器和 Razor 视图。在这一层中,我想将服务注入控制器,例如:

public class HomeController : Controller
{
   private readonly IUserService _userService;

   public HomeController(IUserService userService)
   {
     _userService = userService;
   }
   
   public async Task<IActionResult> Index()
   {
       return await _userService.GetAllUsers();
   }
}

这种架构的理想结果是,在某些时候我们可以更改我们正在使用的 ORM 和数据库的底层实现,而不必更改表示层。

但是目前,我仍然需要在表示层启动时在依赖注入容器中注册AppDbContext(因为UserService依赖于ApplicationDbContext和DI 容器正在尝试解决此问题)。

services.AddDbContext<ApplicationDbContext>(options => 
    options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
services.AddScoped <IUserService, UserService>();

有没有一种方法可以从表示层中删除所有数据访问引用(包括DbContext),这样如果使用了ORM(EF Core)或底层数据库(SQL 例如 MySQL 的服务器)改变了,表示层不需要更新和重新部署?

实际上,在您的应用程序投入生产后更改数据库的情况很少发生,如果发生更改,您可能会更改相关代码或者可能会重新编写整个应用程序。
无论如何,看看这个以实现关注点分离 https://dotnet.microsoft.com/learn/aspnet/architecture

  • 可以引用 UI 层中的数据层,只是在 startup.cs 中用于 DI 目的。
  • 在服务层创建实体,因此UI层可以将实体映射到模型