我正在开展一个多层项目。
我的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属性吗?
我意识到我整个项目的分层方式在这种情况下造成了困难,但我现在无法改变它。因此,非常欢迎任何有关如何在流畅验证中实现此独特规则的建议。
感谢您的帮助。
西尔