Свободный валидатор, чтобы проверить, существует ли сущность с идентификатором в базе данных - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь написать собственный валидатор, который будет проверять, существует ли сущность в базе данных, используя 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);
        }
    }

1 Ответ

0 голосов
/ 13 февраля 2019

Вам понадобится Пользовательский валидатор для настраиваемой проверки доступа к зависимостям, что-то вроде:

RuleFor(x => x.Id)
    .Must(id =>
    {
        using (var db = HostContext.AppHost.GetDbConnection(base.Request))
        {
            return !db.Exists<EntityName>(x => x.Id == id);
        }
    })
    .WithErrorCode("AlreadyExists")
    .WithMessage("...");

Я бы также подумал о том, чтобы просто выполнить проверку с использованием зависимостей в ваших службах.вместо:

if (Db.Exists<EntityName>(x => x.Id == request.Id))
    throw new ArgumentException("Already Exists", nameof(request.Id));
...