Я пытаюсь написать собственный валидатор, который будет проверять, существует ли сущность в базе данных, используя OrmLite.Проблема в том, что аргументы типа для IRuleBuilder больше не могут быть выведены из использования.
Я должен написать вызов метода следующим образом:
RuleFor(r => r.Id).Exists<DtoName, int, EntityName>()
Но я хочу написать это так:
Rulefor(r => r.Id).Exists<EntityName>()
Это происходит потому, что IRuleBuilder имеет два типапараметры и метод является методом расширения.Есть ли умный, свободный способ спроектировать это и сделать вызов функции предпочтительным, как вторая версия?
Вот код для моего метода расширения и моего валидатора:
public static class AbstractValidatorExtensions
{
public static IRuleBuilderOptions<T, TProperty> Exists<T, TProperty, U>(this IRuleBuilder<T, TProperty> ruleBuilder)
{
return ruleBuilder.SetValidator(new EntityExistsValidator<U>());
}
}
public class EntityExistsValidator<T> : PropertyValidator
{
public EntityExistsValidator() : base("Entity does not exist") {}
protected override bool IsValid(PropertyValidatorContext context)
{
return HostContext.Resolve<Repository>()
.Exists<T>((int)context.PropertyValue);
}
}