RPM*_*984 13 validation asp.net-mvc design-patterns poco entity-framework-4
这是场景:
基本上,所有很酷的东西.:)
基本UI操作的事件流程("添加帖子"):
现在,我正在尝试找出可以进行验证的地方.
在这个阶段,我需要两种类型的验证:
现在,我一直在阅读Julie Lerman 撰写的 "编程实体框架,第二版"(这是一个优秀的BTW),并且一直在寻找挂钩SavingChanges事件以执行"最后一分钟"验证.这将是一个很好的方法,以确保每当我做"某事"(添加,修改,删除)时总是会发生验证,但它也有点晚了IMO(因为项目已经在状态管理器中) - 所以我能做什么如果验证失败,删除它们?
我当然可以让我的POCO实现一个接口(比如"IValidatable"),并在此事件期间调用此接口上的方法.
但对于业务验证来说,这似乎"为时已晚" - 这是共识吗?
我基本上都在寻找指导,我正在尝试为复杂的业务逻辑设计一个可重用的智能验证方案,考虑到我的上述架构.
另一个曲线球 - 如你所知,POCO与EF意味着POCO拥有数据库中的所有属性 - 所以我可能有一个"PostID"属性,带有get/set访问器(因为EF需要获取/设置这些属性) ).
但问题是,"PostID"是一个标识列,那么我如何保护该字段不被明确设置?例如,如果我(由于某种原因)执行以下操作:
var post = service.FindSingle(10);
post.PostId = 10;
unitOfWork.Commit();
Run Code Online (Sandbox Code Playgroud)
这将抛出一个SqlException.我该如何防止这种情况?我无法"隐藏"该属性(使其成为私有属性,甚至是内部属性),因为POCO是与存储库分开组装的.
关于验证的说明 - 我计划创建自定义异常(从Exception派生).因此,当验证失败时,我需要抛出这些异常.
这样,我可以在我的控制器上编码这样的代码:
[HttpPost]
public ActionResult AddPost(Post post)
{
try
{
IUnitOfWork uow = new UnitOfWork();
postService.Add(post);
uow.Commit();
}
catch(InvalidPostOperation ipo)
{
// add error to viewmodel
}
}
Run Code Online (Sandbox Code Playgroud)
每次我添加时,我是否必须在服务层上手动进行验证?那我该如何处理Save?(因为这是在工作单元,而不是服务层).
因此,为了防止这是一个"到处都是"的问题,这是我的问题:
任何想法都将非常感激.
如果这篇文章"太长",请道歉,但这是一个重要问题,可以通过多种方式解决,所以我想提供所有信息,以便获得最佳答案.
谢谢.
编辑
以下答案很有帮助,但我仍然(理想情况下)寻找更多想法.还有谁?
DataAnnotations并不适合所有情况。根据我的经验,缺点主要是复杂的验证(多个属性和多个属性不同的对象)。DataAnnotations,因此是“MVC 友好的”。| 归档时间: |
|
| 查看次数: |
3110 次 |
| 最近记录: |