【问题标题】:Where/when should i validate my data when using EF and POCOs?使用 EF 和 POCO 时,我应该在哪里/何时验证我的数据?
【发布时间】:2010-09-06 07:12:05
【问题描述】:
我启动了一个项目来看看 EF 4 可以用 POCO 做什么。我创建了一个数据库和一个自定义 POCO。现在我想验证我的数据。为此,我正在使用 Enterprise Library Validation Block 5。
我没有问题,包括通过属性在我的 POCO 中进行验证并将其与实体框架一起使用,但这意味着我的 POCO 将不再是 POCO,因为我将依赖项插入到验证框架中。
我应该在哪里插入验证部分并保持 POCO 清洁?
【问题讨论】:
标签:
.net
entity-framework
validation
poco
validation-application-bl
【解决方案1】:
我个人认为将验证作为实体的一部分并没有太大问题 - 毕竟,实体 是您的域模型的一部分,可以考虑验证规则,作为其属性的一部分。不过我不是领域建模专家 :)
最后,验证需要在某种程度上与实体耦合。如果您决定减少耦合,我认为最终可能会出现笨拙的代码。对于我的最新项目,我确实将验证拆分为不同的类,它们被放置在实体的部分类中,到目前为止我对结果非常满意。
【解决方案2】:
我同意您希望您的实体免于验证。这不是域对象本身的责任 (SRP)。
除了基于属性的验证,企业库验证应用程序块 (VAB) 还支持基于配置的验证。您可以在此处遵循两种模型:
使用基于 XML 的配置。这得到了很好的支持。 VAB 包含一个配置工具,它允许您配置整个事物而无需编写单行 XML。尤其是5.0的工具非常好。尽管如此,使用 XML 还是很难重构模型中的任何内容(但是,单元测试将帮助您更快地发现错误)。
使用基于代码的配置。虽然我个人喜欢这个模型,因为它可以更好地使您的域易于重构。你可以让它工作,但它还没有得到很好的支持。您可以查看this thread 以查看如何编写基于代码的配置的示例以及当前的不足之处。
祝你好运。
【解决方案3】:
我将创建一个服务类并在该类中进行验证。
例如,您有一个名为 Listing 的 POCO 类。创建一个名为 ListingService 的服务类。然后在 ListingService 中的一个名为 ValidateListing 的方法中进行验证。