【发布时间】:2022-01-08 05:06:49
【问题描述】:
如果我的一些逻辑有缺陷,我深表歉意,因为我是 ASP.NET Core 中规模应用程序开发的新手。我正在使用 Entity Framework Core(代码优先)和 ASP.NET Core 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 Core 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 Server for MySQL)发生更改时,表示层不需要更新和重新部署?
【问题讨论】:
-
我建议你看看“存储库模式”和“洋葱架构”
-
"然而,目前我仍然需要在表示层启动时在依赖注入容器中注册 AppDbContext(因为 UserService 依赖于 ApplicationDbContext 并且 DI 容器正在尝试解决这个问题) 。” -> 不,你没有。在任何适当的层中创建一个扩展方法,例如
public static IServiceCollection InjectInfrastructureServices(this IServiceCollection services),然后从 Startup 调用它 -
啊,这似乎成功了,我没想到要扩展 IserviceCollection。我最终在服务层中添加了扩展,并且必须将配置从启动传递给它。谢谢
标签: c# asp.net-core entity-framework-core asp.net-core-mvc