我正在使用 ASP.Net MVC 3 开发一个数据驱动的 Web 应用程序。我将使用 NHibernate 进行数据访问,但我的问题与语言无关(适用于所有具有异常概念的语言)。
我得出的结论是,对于所提供的完整性机制不够灵活的安全性和边缘情况,我最好在实际数据库和存储库实现中执行我的数据完整性规则以检索所述数据。
问题
我在想我可能应该将上述验证封装在我的 IRepository 实现中。例如,使用自定义 MVC 验证属性来查询数据库进行验证在我看来是不自然的;这种处理似乎最好留给其他地方。
如果我在 IRepository 实现中执行验证,我应该如何将其传播到调用上下文?
我看到几个选项:
Exception
用类似的东西ValidationException
(或者如果它已经存在)进行子类化。提供 USER FRIENDLY 消息作为 Message 属性。
以上很容易实现,但它假设调用上下文想要向用户显示文本。这也使得调用上下文很难提供本地化(我认为这在例外中没有位置 - 我讨厌在谷歌搜索之前尝试翻译!)。
- 与上面相同,但不是文本消息提供
ValidationException<ValidationEnum>
,其中ValidationEnum
是描述主题模型错误的 Enum。
这允许调用上下文完全自由地解释错误。我倾向于这种方法,即使它用大量枚举值污染了代码。
除了这些更漂亮的选择之外,还有其他选择吗?