[英]DI with Entity Framework Entity
我想向实体添加验证类,以便它可以在输入数据库之前检查其是否有效。 (检查是针对业务需求,而不是数据库约束)。
我有课
public class MyEntity
{
private readonly IValidatorFactory _validatorFactory;
public MyEntity(IValidatorFactory validatorFactory)
{
_validatorFactory = validatorFactory;
}
//Entity Properties Removed For Clarity
public void Validate()
{
if(_validatorFactory == null)
{
throw new ArgumentNullException("Validator Factory was null, cannot validate this item");
}
var validator = _validatorFactory.GetValidator(this.ItemTypeId);
valid = validator.Validate();
}
}
使用依赖注入,我正在努力查看如何在项目使用EF6时彻底解决依赖关系。 如果我返回一个DbSet,它当然将不知道验证器的要求。 需要无参数的构造函数。
首先,我认为您不应该尝试将DI与您的实体一起使用 。 验证也应该在您自己的实体内部进行,而不是使用外部验证器(传递给Validate
方法或使用ValidatorFactory
创建)。
实体框架内置了多种验证方法 。 你有没有尝试过这些?
最简单的形式是向属性添加属性,例如Required
和StringLength
。 对于更复杂的验证,您可以让您的实体实现IValidateObject
或重写DbContext.ValidateEntity
。
使用任何这些方法DbEntityValidationException
将提高时,当你打电话验证失败DbContext.SaveChanges
。 您还可以通过调用DbContext.GetValidationErrors
触发验证而不会引发异常。
对外部验证器的需求对我来说就像是闻到了-更不用说繁琐的ValidatorFactory
。
如果您想要避免如您正确地说的贫血领域反模式,则不妨在实体本身中包括验证并始终保持它们有效 。
对我来说没有意义的另一件事是,您确定了四个具有“ 不同的业务需求和验证规则 ”的实体。 IMO正是在这里,您需要特殊实体的特殊性,每个特殊实体都在内部执行自己的规则,而不是外部Validator抽象的通用性。
关于您的4个实体的相似部分(即数据),我将尝试将其提取为有意义的Value Objects并组成这些对象的实体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.