[英]Which Level is Better For Inspection in CRUD Operation?
我在我的應用程序中使用 UnitOfWork 模式。 我在 Page 中實現了Remove方法,如下所示:
public IActionResult OnPostRemove(int id)
{
var report = db.tblDailyReportPiping.Find(id);
if (report == null)
return new JsonResult(new { status = false, message = "Invalid Data" });
//Only user whci created data can remove data
if (report.fldUserId != HttpContext.Session.GetActiveUser_UserId())
return new JsonResult(new { status = false, message = "Incorrect user" });
//current row shal no be approved or finalized
if (report.fldApproved || report.fldFinalized)
return new JsonResult(new { status = false, message = "Approved or finalized before" });
try
{
//remove
if (!db.tblDailyReportPiping.Remove(report))
return new JsonResult(new { status = false, message = "unable to remove" });
//save
if (db.SaveChangesByUserId(HttpContext.Session.GetActiveUser_UserId()) == 0)
return new JsonResult(new { status = false, message = "unable to save" });
}
catch (Exception ex)
{
return new JsonResult(new { status = false, message = ex.Message });
}
return new JsonResult(true);
}
在從 UOW 使用Remove方法之前,我檢查了userId和其他情況等情況。 我的問題是:在 CRUD 操作之前我必須在哪個級別檢查情況? 兩者都是可能的,動作控制或存儲庫中的代碼更少,但是哪一個是最佳實踐?
我可以從我的應用程序的不同部分使用從存儲庫中刪除,並通過將所有代碼移動到存儲庫,我可以在我的應用程序中減少代碼行,只使用從存儲庫中刪除方法,但是,我必須將一些額外的參數傳遞給像 userId 這樣的方法,是嗎正確的方法?
謝謝你們
您的操作方法應該很小,通常最多包含 3 行。 為此,創建一個新的DailyReportPipingService
,然后將所有OnPostRemove
方法的代碼移動到一個名為public Result RemoveReport(int userId)
的新方法中。 現在在您的操作方法中使用這個新方法。 Result
將有一個T Result
屬性和一個bool Success
和string? ErrorMessage
string? ErrorMessage
屬性。 您的驗證邏輯很好,可以提取/重構為該服務中的新方法,以便在其他方法中使用它。 如果您不喜歡這種類型的驗證,您還可以為其創建自定義ActionFilterAttribute
並進行驗證,如果有錯誤,請將其添加到 ActionFilter 的ModelState.AddModelError()
中。 這就是使用ActionFilter
在 MVC 中實現面向 AOP/Aspect 的編程的方式。 您還可以將OnPostRemove
方法的int id
參數更改為 class 並為其編寫自定義驗證器。 通常,驗證是一個cross-cutting concern
,不應與您的business logic
混為一談。 所以在這里為action方法的參數編寫一個自定義的驗證器是一個更好的選擇。
謝謝親愛VahidN
。
對不起,如果我的問題是初學者。
我的解決方案包括IRepositories
項目(接口類)和Repository
項目(IRepositories 的實現):
Admin
。 為此,我在方法中添加了bool force
參數。 如果值為true
,將立即完成刪除。id
2) userId
3) force
。 我可以將它們傳遞給方法嗎?custome ActionFilter
,最后我需要獲取數據並進行驗證。 那么,為什么不在Remove
方法中進行驗證呢? Mybe 最終應用程序是 windows 應用程序或 WPF,其中我沒有ActionFilter
,我應該創建新的驗證方法。 我最擔心的是當前用戶的HttpContext
或Session
中存在的一些數據。 在需要創建新的和單獨的項目( for modularization
)的任何類型的模式中,我必須將這些數據傳遞給新項目。 如果我想消除新項目,我必須在 WebApp 項目中創建新命名空間才能訪問HttpContext
或Session
數據。
謝謝你的幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.