繁体   English   中英

带实体框架实体的DI

[英]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创建)。

实体框架内置了多种验证方法 你有没有尝试过这些?

最简单的形式是向属性添加属性,例如RequiredStringLength 对于更复杂的验证,您可以让您的实体实现IValidateObject或重写DbContext.ValidateEntity

使用任何这些方法DbEntityValidationException将提高时,当你打电话验证失败DbContext.SaveChanges 您还可以通过调用DbContext.GetValidationErrors触发验证而不会引发异常。

对外部验证器的需求对我来说就像是闻到了-更不用说繁琐的ValidatorFactory

如果您想要避免如您正确地说的贫血领域反模式,则不妨在实体本身中包括验证并始终保持它们有效

对我来说没有意义的另一件事是,您确定了四个具有“ 不同的业务需求和验证规则 ”的实体。 IMO正是在这里,您需要特殊实体的特殊性,每个特殊实体都在内部执行自己的规则,而不是外部Validator抽象的通用性。

关于您的4个实体的相似部分(即数据),我将尝试将其提取为有意义的Value Objects并组成这些对象的实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM