我正试图在MVC场景中进行验证。我有我的应用程序设置,以便它有一个使用Linq2SQL的数据/存储库层,并在我的域模型中创建对象。我不会将我的Linq2SQL对象直接暴露给我的应用程序的其余部分,但是,现在,我的域模型大多看起来像我的数据库表。如果我想稍后放弃Linq2SQL,我想这样做。
然后我有一个从我的控制器调用的服务层来执行操作并从我的数据层中获取我的域模型。
我想使用xVal之类的验证框架。您的模型应该包含验证规则似乎是一种常识。我的问题是你如何验证模型的一部分(或各种状态)?例如,我有一个User对象,其中包含用户名,密码和其他属性。我有一个登录操作,我想确保提供用户名和密码。但是,当我创建一个新用户时,我想要更多的字段。当我已经有了User对象时,在我的模型中创建一个Login对象似乎很奇怪。
现在,我的登录操作只是发布了一个用户名和密码参数。
答案 0 :(得分:2)
你是对的,模型层通常验证。问题可能出在你的领域模型中 - 你知道用户在其中包含所有内容之前无效。
思考而不是可以匿名的用户,或者可以填写。想出来的一个简单方法是让用户拥有一个Credentials对象的实例;这也是跟踪权限等的好地方。
答案 1 :(得分:0)
我很抱歉,但我无法超越你的榜样。用户对象不应具有登录方法。我所做的是有以下
public class User
{
public bool ConfirmPassword(string password)
{
...
}
}
然后是一个存储库。这会按用户名查找用户,然后检查ConfirmPassword以查看它是否正确,否则返回null。
public interface IUserRepository
{
..other stuff..
User GetByUserNameAndPassword(string userName, string password);
}
至于验证,我通常有两种获得约束的方法。
//The constraint itself
public interface IConstraint
{
string Name { get; }
bool IsValid();
}
//A way to get constraints that are inexpensive to evaluate, such
//as Name != null etc. This can be implemented as a service to provide
//custom constraints from an external source (such as rows in a DB)
//which then additionally checks "instance" if it implements the
//interface and adds its constraints to the result too.
//These are the kinds of constraints I evaluated in the GUI every
//time the object changes, so I can show a list of errors.
public interface IConstraintProvider
{
IEnumerable<IConstraint> GetConstraints(object instance);
}
//Finally a way to get constraints that are expensive to evaluate, this
//includes checking invariants that might involve DB access. These constraints
//(along with the cheap evaluation constraints) are all evaluated before
//my persistence service attempts to write the object's changes to the DB
public interface IPreSaveConstraintProvider
{
IEnumerable<IConstraint> GetConstraints(object instance);
}