BLL&amp ;;中的流畅验证DAL-循环参考

时间:2017-03-13 06:15:04

标签: c# asp.net-core fluentvalidation

我正在开展一个多层项目。

我的BLL项目包含我的所有模型及其相关的验证规则。 我的DAL项目建立了与DB的连接,定义了我的项目上下文,并引用了BLL模型来定义映射。

Eveything工作正常,直到我需要使用FluentValidation添加新规则来验证员工姓名的唯一性。

我的员工模型示例以及我的BLL中的员工验证规则:

[Validator(typeof(StaffValidator))]
public class STAFF
{
    public string FullName { get; set; }
}

public class StaffValidator : AbstractValidator<STAFF>
    {    
    public StaffValidator()
        {
                RuleFor(cmd => cmd.FullName ).Must(BeUniqueName)
                    .WithMessage("This staff already exists");
        }

        private bool BeUniqueName(STAFF Thestaff, string fullName)
            {
                MyContext _context = new MyContext ();
                var dbStaff = _context.STAFF
                                    .Where(x => x.fullName.ToLower() == fullName.ToLower())
                                    .SingleOrDefault();

                if (dbStaff == null)
                    return true;

                return dbStaff.ID == Thestaff.ID;
            }
    }

为了在BLL中的验证类中执行此操作,我需要使用我的DAL中的上下文,这是不可能的,因为我的DAL已经引用了我的BLL而且由于循环引用我不能反过来。

然后我尝试将所有验证逻辑放在一个单独的层(“验证”)中,该层调用模型的BLL和上下文的DAL。

但是,我无法工作,因为我无法在BLL中使用Validator属性(循环引用问题)在我的Validation层中引用AbstractValidator来装饰我的模型。

[Validator(typeof(StaffValidator))]

那么,有没有办法做我想做的事情?我可以在别处定义Validator属性吗?

我意识到我整个项目的分层方式在这种情况下造成了困难,但我现在无法改变它。因此,非常欢迎任何有关如何在流畅验证中实现此独特规则的建议。

感谢您的帮助。

西尔

0 个答案:

没有答案