簡體   English   中英

CRUD操作中哪個級別更適合檢查?

[英]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 Successstring? 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 的實現):

  1. 我需要在我的解決方案中添加更多項目嗎? 還是我應該重構當前的結構?
  2. 在執行任何操作之前,我需要來自客戶端的一些數據來檢查條件,我可以從操作方法或任何前端(WPF、WinApp)將更多參數傳遞給存儲庫方法嗎?
  3. 在某些情況下,我想強制方法刪除任何標准的數據白化,因為當前用戶是Admin 為此,我在方法中添加了bool force參數。 如果值為true ,將立即完成刪除。
  4. 在大多數方法中,三個參數很重要:1) id 2) userId 3) force 我可以將它們傳遞給方法嗎?
  5. 如果我創建custome ActionFilter ,最后我需要獲取數據並進行驗證。 那么,為什么不在Remove方法中進行驗證呢? Mybe 最終應用程序是 windows 應用程序或 WPF,其中我沒有ActionFilter ,我應該創建新的驗證方法。

我最擔心的是當前用戶的HttpContextSession中存在的一些數據。 在需要創建新的和單獨的項目( for modularization )的任何類型的模式中,我必須將這些數據傳遞給新項目。 如果我想消除新項目,我必須在 WebApp 項目中創建新命名空間才能訪問HttpContextSession數據。

謝謝你的幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM