在更新或添加到数据库之前,是否有任何关于如何连接需要与数据库交互的验证的链接或建议?我看到的每个示例都显示了如何验证属性,例“是必需的”,“是电子邮件”,“是数字”等,但是如何连接“无法订购缺货商品”的验证? This xVal blog post触及它,但没有提供示例。
我一直在关注使用存储库的NerdDinner教程,但这是我不太理解的...说我们有一个带有Create方法的OrderController,在创建订单之前我们必须首先检查该商品有货。在NerdDinner样式中, Controller使用存储库与数据库通信,因此我们的Order对象(Model)如何能够与属性验证一起强制执行此验证,因为它无法与之交谈数据库?
感谢您的帮助
答案 0 :(得分:3)
在NerdDinner教程中,您可以签出IsVaild,然后签出GetRuleViolation方法。根据您的业务和数据库规则,您可以使用这些规则检查插入之前的数据。您甚至可以创建一个IsValidForInsert方法来检查您需要强制执行的任何插入特定规则。
在NerdDinner中,GetRuleViolation允许您检索违规规则并根据您的选择将它们冒泡到界面。
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
public IEnumerable<RuleViolation> GetRuleViolations()
{
if (CheckDbForViolation)
yield return new RuleViolation("Database Violation", "SomeField");
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("Title is required", "Title");
if (String.IsNullOrEmpty(Description))
yield return new RuleViolation("Description is required", "Description");
if (String.IsNullOrEmpty(HostedBy))
yield return new RuleViolation("HostedBy is required", "HostedBy");
... etc ...
yield break;
}
public bool CheckDbForViolation()
{
/// Do your database work here...
}
您可以进一步将数据库代码拆分到存储库中。 CheckDbForViolation将调用repo获取信息,然后确定是否存在违规。事实上,如果您正在使用存储库,我认为这将是更好的方式。
答案 1 :(得分:1)
您并不需要有关如何执行此操作的示例的任何指导。最终,您必须能够自己创建这样的应用程序,这意味着要有创意。
我从一开始就决定不使用内置验证或成员资格API,以免在某些时候遇到其限制。
根据您的情况:它非常标准。
想象一下执行流程如下:
尽量将控制器方法保持为空。验证和操作逻辑应该驻留在您的模型和业务逻辑中。控制器基本上应该尝试一个预期的操作,并根据返回的状态返回一个视图或另一个视图。可能还有一些选项,但不是用户角色,访问权限,调用某些Web服务等的全部检查。保持简单。
P.S。我有时会觉得内置功能旨在简化大多数开发人员的简单操作,这往往会为删除的内容创造新的障碍。
答案 2 :(得分:0)
我将使用方法PlaceOrder(订单顺序)创建OrderService。 OrderService使用存储库来执行CRUD操作并强制执行业务规则(库存检查),并最终抛出违反规则的异常,您可以捕获并向用户报告。