我已经构建了一个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但似乎必须在每个类的基础上创建规则而不是类/动作。
感谢。
答案 0 :(得分: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
对象总是需要Username
和 ID
才有效。而CreateUserAction
对象甚至没有ID
(因为它不需要一个)而DeleteUserAction
对象没有Username
(因为它没有不需要一个。
您可以根据需要进一步添加其他字段。例如,CreateUserAction
对象可能有其他字段来描述正在创建的用户。 (它甚至可能包含根本不在User
对象上的字段,但会被转换为域中的其他对象。)但是,DeleteUserAction
可能永远不需要ID
(并且,正如SLaks所建议的那样,对于该操作方法,可能只能替换为int
,但这取决于您)。
更清晰的角色和职责,减少部分初始化的半对象。