如果我的某些邏輯有缺陷,我很抱歉,因為我是 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)發生更改,表示層將不會需要更新和重新部署嗎?
uj5u.com熱心網友回復:
實際上,在您的應用程式投入生產后更改 DB 下的情況很少發生,如果您更改相關代碼或可能會重新撰寫整個應用程式。
無論如何,看看這個以實作關注點分離https://dotnet.microsoft.com/learn/aspnet/architecture
- 為了DI目的,可以在startup.cs中參考UI層中的資料層。
- 在服務層創建物體,所以UI層可以將物體映射到模型
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/372578.html
