【问题标题】:Should I check if a user exists before deleting it?我应该在删除之前检查用户是否存在吗?
【发布时间】:2018-04-19 11:01:44
【问题描述】:

我多次看到这样的代码:

var user = await _userManager.FindByNameAsync(username);
var result = await _userManager.DeleteAsync(user);

return new JsonResult(result);

但是我想知道您的意见,如果这样做是好的还是更好的执行 if 语句来检查用户是否真的存在?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-identity


    【解决方案1】:

    这取决于_userManager.DeleteAsync 的实现,因为您使用的是.Net Core Identity,所以DeleteAsync 方法的实现将抛出ArgumentNullException

    你可以查看源代码here,这里是方法的实现:

    public virtual Task<IdentityResult> DeleteAsync(TUser user)
        {
            ThrowIfDisposed();
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
    
            return Store.DeleteAsync(user, CancellationToken);
        }
    

    【讨论】:

      【解决方案2】:

      答案取决于执行删除的上下文:

      • 如果您的程序正在与请求删除用户的最终用户进行主动交互,那么知道他要删除的用户不存在是一条有价值的信息,因此您应该报告它。
      • 如果您的程序执行某种批处理清理,并且用户可能存在或可能不存在的情况很好,那么您可以跳过检查。

      注意您的代码最终会在 user 中检查 null,以避免在调用 DeleteAsync 时避免 ArgumentNullException。这只是一个实现细节:您需要做出的真正决定是如何处理它。

      【讨论】:

        【解决方案3】:

        注意:此答案假定您使用的是内置的 UserManager 而不是自定义的。

        正如您在source code 中看到的:

        public virtual Task<IdentityResult> DeleteAsync(TUser user)
        {
            ThrowIfDisposed();
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
        
            return Store.DeleteAsync(user, CancellationToken);
        }
        

        null 作为参数传递给DeleteAsync 会抛出ArgumentNullException。所以,不,您提供的代码不正确。您需要首先检查用户是否存在:

        var user = await _userManager.FindByNameAsync(username);
        
        if (user == null)
        {
            return BadRequest("User not found");
        }
        
        var result = await _userManager.DeleteAsync(user);
        
        return Json(result);
        

        【讨论】:

        • @Nyerguds 为什么要捕获一个完全不需要抛出的异常?例外是昂贵的
        • 并非如此。与数据库调用相比,这笔费用完全可以忽略不计。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        相关资源
        最近更新 更多