ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

首页> C#> FluentValidation检查子集合中的重复实体

2019-11-20 09:09:48  阅读:401  来源: 互联网

标签:c fluentvalidation


我有一个MainEntity类,它具有SubEntity的集合.以下是当前验证:

public class MainEntityValidator : AbstractValidator<MainEntity>
{
    public MainEntityValidator()
    {
        RuleFor(x => x.SubEntities).SetCollectionValidator(new SubEntityValidator());
    }

    public class SubEntityValidator : AbstractValidator<SubEntity>
    {
        public SubEntityValidator()
        {
            RuleFor(x => x.Field1).NotNull();
            RuleFor(x => x.Field2).NotNull();
        }
    }
}

如何添加验证规则,以便仅唯一的SubEntity对象(基于Field1和Field2)必须位于集合中?

解决方法:

如果您需要将验证规则应用于集合属性,但仍需要访问主模型和(或)整个集合,不仅要验证项目,那么可以选择RuleForEach方法:

var comparer = new SubEntityComparer();

RuleForEach(x => x.SubEntities)
    .Must((model, submodel) => model.SubEntities.Count(xsub => comparer.Equals(xsub, submodel)) == 1) // one match that ReferenceEquals hit
    .WithMessage("The item with values {0}, {1} has duplicates in collection of {2} items",
        (model, submodel) => submodel.Field1,
        (model, submodel) => submodel.Field2,
        (model, submodel) => model.SubEntities.Count); // in validation message generation you can access to current item as well as to main model

如果您仅需要一条错误消息作为您描述的验证规则,则可以将简单的谓词规则应用于集合属性SubEntites:

RuleFor(x => x.SubEntities)
    .Must(coll => coll.Distinct(new SubEntityComparer()).Count() == coll.Count)
    .WithMessage("One or more items in collection of {0} items are duplicates",
        (model, coll) => coll.Count); // has access to collection and to main model

在这两种情况下,我都使用相同的相等比较器,但是您也可以覆盖Equals方法,并使用IEnumerable扩展方法的重载和重载,但不包括EqualityComparer参数.

下面列出的EqualComparer代码:

public class SubEntityComparer : IEqualityComparer<SubEntity>
{
    public bool Equals(SubEntity x, SubEntity y)
    {
        if (x == null ^ y == null)
            return false;

        if (ReferenceEquals(x, y))
            return true;

        // your equality comparison logic goes here:
        return x.Field1 == y.Field1 &&
               x.Field2 == y.Field2;
    }

    public int GetHashCode(SubEntity obj)
    {
        return obj.Field1.GetHashCode() + 37 * obj.Field2.GetHashCode();
    }
}

更新:

在两种实现收集验证的方式中,您仍然可以使用SetCollectionValidator(new SubEntityValidator())独立地使用简单规则来验证每个项目.

标签:c,fluentvalidation
来源: https://codeday.me/bug/20191120/2042889.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有