存储库模式 - 验证对象并返回消息

Oyy*_*you 7 c# asp.net model-view-controller repository-pattern

我正在开发一个网站,只是想了解总体结构。我在后台有一个数据库,我正在使用“存储库模式”访问该数据库。我的UserRepository类中有以下代码:

public bool IsValid(User user)
{
  if (_context.Users.Any(c => c.EmailAddress == user.EmailAddress))
  {
    Message = "Email address already in use";
    return false;
  }

  return true;
}
Run Code Online (Sandbox Code Playgroud)

这是在这里实现的

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(User user)
{
  if (ModelState.IsValid)
  {
    var context = new Context("DatabaseContext");
    var userRepo = new UserRepository(context);

    if (userRepo.IsValid(user))
    {
      userRepo.Add(user);
      // return to different view
    }
    else
    {
      // display userRepo.Message on page
      return View(user);
    }
  }

  return View(user);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我认为我没有正确地处理“消息”位,但我在网上找不到任何可以帮助我的东西(特别是在存储库周围)。我认为我应该将IsValid的返回类型更改为类似结果的类型(正如我在对话框中看到的那样),但我再次不确定。

任何帮助将非常感激。

谢谢。

Oli*_*ver 3

实现此目的的一种方法与您建议的完全一样 -更改 的返回类型IsValid

过去,我在“业务层”中使用了类似的验证方法,这些方法返回 的集合ValidationResult,其中每个返回的记录都会导致模型内的验证错误,并且空集合将被解释为有效模型。

例如:

public class ValidationResult
{
    public string FieldName { get; set; }
    public string Message { get; set; }
}

public interface IValidator<T>
{
    IEnumerable<ValidationResult> IsValid(T model);
}

//...in your implementation
public IEnumerable<ValidationResult> IsValid(User user)
{
    //Return a new ValidationResult per validation error
    if (_context.Users.Any(c => c.EmailAddress == user.EmailAddress))
    {
        yield return new ValidationResult
        {
            Message = "Email address already in use",
            FieldName = nameof(user.EmailAddress)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的表示层可以将其解释为反馈给用户。