2024-09-13 用 ASP .NET + DAPPER 來舉例餐廳

當用 ASP.NET 和 Dapper 來類比餐廳時,我們可以用這些技術來模擬餐廳的運作,以下是一個如何把 ASP.NET 和 Dapper 應用於餐廳管理的比喻:

1. ASP.NET:建立餐廳管理系統

ASP.NET 是用來建立餐廳管理系統的框架。這個系統能夠處理顧客點餐、菜品管理、訂單處理等操作。它就像餐廳的前台系統,負責接收顧客的點餐要求,處理訂單,並展示菜品的資訊。

2. Dapper:與資料庫交互

Dapper 是一個輕量級的 ORM(對象關聯映射)庫,用來快速簡便地與資料庫交互。它就像是餐廳中的點菜系統,快速將顧客的訂單資料傳送到廚房,並從廚房那裡取得製作完成的菜品資料。

餐廳管理系統的比喻:

1. 顧客點餐(ASP.NET 控制器)

比喻:顧客在餐廳點餐,前台服務員(ASP.NET 控制器)接收顧客的點餐要求(HTTP 請求),並將其轉交給廚房(資料庫)處理。

  • ASP.NET 控制器:接收點餐請求(例如,菜品查詢、訂單創建)。
  • HTTP 請求:顧客的點餐要求,例如「我要一個披薩」。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Route("api/[controller]")]
[ApiController]
public class MenuController : ControllerBase
{
private readonly IMenuService _menuService;

public MenuController(IMenuService menuService)
{
_menuService = menuService;
}

[HttpGet("items")]
public IActionResult GetMenuItems()
{
var items = _menuService.GetMenuItems();
return Ok(items);
}

[HttpPost("order")]
public IActionResult PlaceOrder([FromBody] OrderRequest orderRequest)
{
var result = _menuService.PlaceOrder(orderRequest);
return Ok(result);
}
}

2. 廚房處理訂單(Dapper)

比喻:廚房(資料庫)接收到訂單後,根據菜單準備菜品。Dapper 就像是廚房的工作流程,用來快速從食材庫存中提取所需的資料並準備菜品。

  • Dapper:執行 SQL 查詢,從資料庫中檢索菜品資訊或儲存訂單。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MenuService : IMenuService
{
private readonly IDbConnection _dbConnection;

public MenuService(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}

public IEnumerable<MenuItem> GetMenuItems()
{
var sql = "SELECT * FROM MenuItems";
return _dbConnection.Query<MenuItem>(sql);
}

public bool PlaceOrder(OrderRequest orderRequest)
{
var sql = "INSERT INTO Orders (CustomerId, ItemId, Quantity) VALUES (@CustomerId, @ItemId, @Quantity)";
var rowsAffected = _dbConnection.Execute(sql, orderRequest);
return rowsAffected > 0;
}
}

3. 顧客接收菜品(ASP.NET 控制器回應)

比喻:當廚房完成菜品後,服務員(ASP.NET 控制器)將菜品送到顧客的桌上。這相當於將資料庫的查詢結果回傳給顧客的點餐應用。

  • ASP.NET 控制器回應:將廚房(資料庫)處理完成的菜品資訊或訂單狀態返回給顧客。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MenuController : ControllerBase
{
private readonly IMenuService _menuService;

public MenuController(IMenuService menuService)
{
_menuService = menuService;
}

[HttpGet("items")]
public IActionResult GetMenuItems()
{
var items = _menuService.GetMenuItems();
return Ok(items); // 返回菜單項目
}

[HttpPost("order")]
public IActionResult PlaceOrder([FromBody] OrderRequest orderRequest)
{
var result = _menuService.PlaceOrder(orderRequest);
return result ? Ok("Order placed successfully") : BadRequest("Failed to place order");
}
}

總結

  • ASP.NET:就像是餐廳的點餐系統,負責接收顧客的點餐請求和展示菜單。
  • Dapper:就像是廚房的工作流程,快速處理資料庫的查詢和更新。
  • 顧客、點餐:顧客向前台服務員(ASP.NET 控制器)點餐。
  • 廚房、製作菜品:廚房(資料庫)使用 Dapper 準備菜品並回應前台服務員。

這個比喻幫助理解 ASP.NET 和 Dapper 如何協同工作,處理點餐請求和數據交互。

那如果再細分到自己寫的 CONTROLLER呢

當然可以!我們可以使用您提供的程式結構,將餐廳的比喻應用到 ASP.NET Core + Dapper 的實際程式碼中。這裡是如何用您給的程式結構來比喻這些概念:

餐廳系統的 Controller 與 Dapper 例子

1. Controller(服務員)

在餐廳中,服務員(Controller)接收顧客的點餐要求,並將其轉交給廚房(Service)。這就像我們的 SYSM001Controller 類別,處理顧客的請求,並將結果返回給顧客。

程式碼示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[Route("api/[controller]")]
[ApiController]
public class SYSM001Controller : ControllerBase
{
private readonly SYSM001Service _service;
private readonly CommonService _commonService;

public SYSM001Controller(SYSM001Service service, CommonService commonService, ILogger<SYSM001Controller> logger)
{
_service = service;
_commonService = commonService;
}

/// <summary>
/// 系統參數資料明細查詢作業
/// </summary>
[HttpPost("Query")]
public IActionResult Get([FromBody] SYSM001Q_InputVo inputVo)
{
var result = _service.QueryDetailResult(inputVo);
return ProcessResult(result);
}

/// <summary>
/// 系統別資料查詢作業
/// </summary>
[HttpPost("QuerySyst")]
public IActionResult QuerySyst([FromBody] SubSyst_InputVo inputVo)
{
var result = _commonService.QuerySubSystemResult(inputVo);
return ProcessResult(result);
}

/// <summary>
/// 系統參數資料編輯作業
/// </summary>
[HttpPut("Edit")]
public IActionResult Edit([FromBody] List<SYSM001E_TotVo> inputVo)
{
var result = _service.EditResult(inputVo);
return ProcessResult(result);
}

private IActionResult ProcessResult(ServiceResult result)
{
switch (result.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
return Ok(new ApiResult { RESULT_CODE = SysMessage.S0000001, RESULT = result.result, RESULT_MESSAGE = result.message });
case CommonEnum.ACTION_STATUS.NOTFOUND:
return NotFound(new ApiResult { RESULT_CODE = SysMessage.S0000001, RESULT_MESSAGE = result.message });
default:
return StatusCode(500, new ApiResult { RESULT_CODE = SysMessage.S0010001, RESULT_MESSAGE = result.message });
}
}
}

2. Service(廚房)

廚房(Service 層)負責處理來自服務員的點餐要求,並與資料庫進行交互。這就像 SYSM001ServiceCommonService 類別,處理實際的業務邏輯和資料庫操作。

程式碼示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class SYSM001Service
{
private readonly IDbConnection _dbConnection;

public SYSM001Service(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}

public ServiceResult<List<SYSM001Q_OutputVo>> QueryDetailResult(SYSM001Q_InputVo inputVo)
{
var sql = "SELECT * FROM SystemParameters WHERE ..."; // SQL 查詢語句
var result = _dbConnection.Query<SYSM001Q_OutputVo>(sql, inputVo);
return new ServiceResult<List<SYSM001Q_OutputVo>> { result = result.ToList(), status = CommonEnum.ACTION_STATUS.SUCCESS };
}

public ServiceResult<int> EditResult(List<SYSM001E_TotVo> inputVo)
{
var sql = "UPDATE SystemParameters SET ... WHERE ..."; // SQL 更新語句
var rowsAffected = _dbConnection.Execute(sql, inputVo);
return new ServiceResult<int> { result = rowsAffected, status = CommonEnum.ACTION_STATUS.SUCCESS };
}
}

public class CommonService
{
private readonly IDbConnection _dbConnection;

public CommonService(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}

public ServiceResult<List<SubSyst_OutputVo>> QuerySubSystemResult(SubSyst_InputVo inputVo)
{
var sql = "SELECT * FROM SubSystem WHERE ..."; // SQL 查詢語句
var result = _dbConnection.Query<SubSyst_OutputVo>(sql, inputVo);
return new ServiceResult<List<SubSyst_OutputVo>> { result = result.ToList(), status = CommonEnum.ACTION_STATUS.SUCCESS };
}
}

3. Dapper(廚房的設備和食材)

Dapper 負責與資料庫進行交互,像是廚房中的設備和食材,幫助廚房完成菜品的準備。

Dapper 操作示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 在 SYSM001Service 中的查詢和更新操作
public ServiceResult<List<SYSM001Q_OutputVo>> QueryDetailResult(SYSM001Q_InputVo inputVo)
{
var sql = "SELECT * FROM SystemParameters WHERE ...";
var result = _dbConnection.Query<SYSM001Q_OutputVo>(sql, inputVo);
return new ServiceResult<List<SYSM001Q_OutputVo>> { result = result.ToList(), status = CommonEnum.ACTION_STATUS.SUCCESS };
}

public ServiceResult<int> EditResult(List<SYSM001E_TotVo> inputVo)
{
var sql = "UPDATE SystemParameters SET ... WHERE ...";
var rowsAffected = _dbConnection.Execute(sql, inputVo);
return new ServiceResult<int> { result = rowsAffected, status = CommonEnum.ACTION_STATUS.SUCCESS };
}

總結

  • Controller(服務員):接收顧客的點餐請求,將其傳遞給廚房,並將結果帶回給顧客。
  • Service 層(廚房):處理實際的業務邏輯和資料庫操作。
  • Dapper(設備和食材):提供高效的資料庫存取和操作功能。

這樣的比喻有助於理解 ASP.NET Core 中 Controller、Service 層和 Dapper 如何協作,像餐廳中的服務員、廚房和廚房設備如何協作來滿足顧客的需求。