我想向实体添加验证类,因此它可以在输入数据库之前检查它是否有效。 (检查是针对业务需求,而不是数据库约束)。
我有班级
--------KEY----------------------------VALUE-----
newrowstart ------------------------newrowstart
LearnerTelephones_ID----------------3797d9ab-df28-423e-b847-f7c1abbac26a
LearnerTelephones_IsFirst-----------FALSE
newrowstart ------------------------newrowstart
LearnerTelephones_L_ID ------------88a86894-f3fa-4ff0-bb0c-814a2434e841
newrowstart ------------------------newrowstart
LearnerTelephones_Ln_IDNAME---------my name
LearnerTelephones_Ln_IDAdd --------my id address
newrowend ------------------------newrowend
newrowstart-------------------------newrowstart
LearnerTelephones_Ln_IDNAME---------my name2
LearnerTelephones_Ln_IDAdd----------my id address2
newrowend ------------------------newrowend
newrowend --------newrowend
LearnerTelephones_Notes --------null
LearnerTelephones_TelephoneNumber---1234 505050
LearnerTelephones_UseForText--------null
newrowend---------------------------newrowend
使用依赖注入,我很难看到当项目使用EF6时如何干净地解决依赖关系。如果我返回DbSet,它当然不知道验证器的要求。无参数构造函数是必需的。
答案 0 :(得分:3)
首先,我认为你不应该尝试use DI with your entities。验证应该也可能在您的实体本身内发生,而不是使用外部验证器(传递到Validate
方法或使用ValidatorFactory
创建)。
实体框架有multiple ways to do validation built in。你试过其中的任何一个吗?
最简单的形式是向属性添加属性,例如Required
和StringLength
。要进行更复杂的验证,您可以让实体实施IValidateObject
或覆盖DbContext.ValidateEntity
。
当您调用DbEntityValidationException
时,如果验证失败,则会使用这些方法中的任何一个DbContext.SaveChanges
。您也可以通过调用DbContext.GetValidationErrors
来触发验证而不会抛出异常。
答案 1 :(得分:2)
对外部验证器的需求对我来说就像是一种嗅觉 - 更不用说复杂的ValidatorFactory
。
如果你想正确地说避免贫血域反模式,你可能还要在实体中包含验证并保留它们valid at all times。
另一件对我没有意义的事情是,您确定了4个具有“不同业务要求和验证规则”的实体。 IMO正是在这里你需要ad hoc实体的特殊性,每个实体都在内部强制执行自己的规则,而不是外部Validator抽象的通用性。
关于4个实体的相似部分,即数据,我会尝试将其提取为有意义的Value Objects并组合这些对象的实体。