0

我已经构建了一个 api,需要验证作为参数传递给控制器​​操作的输入对象。有时,相同的输入类对于不同的动作会有不同的强制属性。

所以

public class test
{
public ActionResult Create(User user)
{
  //here user_name must be present but no user_id
}
public ActionResult Delete(User user)
{
  //here only user_id must be present.
}
}

我看过 fluentValidation.net 但似乎必须基于每个类而不是类/动作创建规则。

谢谢。

4

1 回答 1

2

什么是User?

我的意思不是类在哪里定义,而是它在域中的物理含义是什么?听起来你试图让它意味着多件事。

与其尝试将这些动作拟合到域模型中,不如为它们创建动作模型。像这样的东西:

class CreateUserAction
{
  public string Username {get; set;}
}

class DeleteUserAction
{
  public int ID {get; set;}
}

然后在您的操作方法中使用这些:

public ActionResult Create(CreateUserAction user)
{
}

public ActionResult Delete(DeleteUserAction user)
{
}

这将按照单一职责原则将不同的目的分解为不同的类。现在User该类可以专注于简单地表示用户对象,而不是有时表示尚未创建的用户或有时仅表示用户对象的 ID 等。

这里的一个主要好处是您可以直接在类中指定验证规则。使用这种方法,User对象总是可以要求 aUsername anID有效。而一个CreateUserAction对象甚至没有一个ID(因为它不需要一个),一个DeleteUserAction对象没有一个Username(因为它不需要一个)。

您可以根据需要进一步添加其他字段。例如,该CreateUserAction对象可能有其他字段来描述正在创建的用户。(它甚至可能具有根本不存在于User对象上的字段,但会被转换为域中的其他对象。)但是,DeleteUserAction可能永远不需要更多的东西ID(并且,正如 SLaks 所建议的那样,可能只替换int为 for 该操作方法,但这取决于您)。

类的角色和职责更清晰,部分初始化的半对象更少。

于 2012-01-30T17:52:30.370 回答