服务层

时间:2015-12-07 22:00:08

标签: c# validation asp.net-core entity-framework-core onion-architecture

我们正在使用asp.net 5和带有Onion架构的EF7构建我们的应用程序。我们不知道如何在实体保存在我们的服务层的数据库中之前验证它们。

我们的结构是这样的;

CORE

  • Domain.Entities (由EF7生成的POCO)
  • Dto (没有注释的纯C#类)

基础设施

  • 数据(我们这里只有DbContext,我们不使用存储库)
  • 服务(使用EF7作为存储库并执行所有数据库操作。将Domain.Entities POCO映射到DTO,反之亦然 Automapper。返回DTO结果)

演示

  • 模型(类似于DTO但具有验证属性)
  • Web (MVC 6项目。控制器使用服务并映射 DTO模型,反之亦然,并通过模型进行验证)

我们的问题是我们不知道如何处理服务层中的验证。 EF7不像过去那样验证实体(https://github.com/aspnet/EntityFramework/wiki/Entity-Framework-Design-Meeting-Notes---July-17,-2014)。我们不希望服务的另一个DTO /模型层在其中放置验证,因为我们在Presentation层中有我们的Model项目。

最好的方法是什么?

编辑:

我们尝试在EF7中使用DbEntityValidationException来处理通过EF的验证,但我们发现它是不可能的。我们还尝试在服务层中为每个DTO设置验证类,但它对我们来说听起来不对,因为它增加了编码的复杂性。 我们也试过以下方法;我们通过reveng工具生成带有数据注释的实体。我们验证了如下的实体类;

public class EntityBase 
{   
    public virtual DateTime CreatedDate { get; set; }
    public virtual string CreatedBy { get; set; }
    public virtual DateTime ModifiedDate { get; set; }
    public virtual string ModifiedBy { get; set; }
    public int RowVersion { get; set; }

}
public class MyEntity
{   
    public virtual int MyEntityId { get; set; }
    [MaxLength(50)]
    public virtual string Name { get; set;}

}
public static class EntityValidator
{
    public static ICollection<ValidationResult> Validate(this EntityBase entity)
    {
        if (entity == null) return new List<ValidationResult>();

        var validationErrors = new List<ValidationResult>();
        var context = new ValidationContext(entity, null, null);
        var isValid = Validator.TryValidateObject(entity, context, validationErrors,true);
        return validationErrors;
    }
}

这样我们可以像使用它一样;我们的服务层中的 var errors = myEntity.Validate();

我们仍在寻找更好的解决方案。

0 个答案:

没有答案