如何使用 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 个不同的层:
- 数据层(数据访问层)
这将包含迁移,ApplicationDbContext
和代表我程序中实体的 POCO。
- 服务层级
这将包含用于从数据层访问数据的接口及其具体实现。
// 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();
}
}
- 表示层(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层可以将实体映射到模型
如果我的某些逻辑有缺陷,我深表歉意,因为我是 ASP.NET Core 中中等规模应用程序开发的新手。我正在使用 Entity Framework 核心(代码优先)和 ASP.NET 核心 5 MVC,并希望能够将我的项目分成 3 个不同的层:
- 数据层(数据访问层)
这将包含迁移,ApplicationDbContext
和代表我程序中实体的 POCO。
- 服务层级
这将包含用于从数据层访问数据的接口及其具体实现。
// 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();
}
}
- 表示层(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层可以将实体映射到模型