Внедрение DbContext в валидатор FluentValidation - PullRequest
8 голосов
/ 17 августа 2011

Я использую библиотеку FluentValidation для применения уникального ограничения для одной из моих моделей:

public class Foo {
    // No two Foos can have the same value for Bar
    public int Bar { get; set; }
}

public class FooValidator : AbstractValidator<Foo> {

    public FooValidator(ApplicationDbContext context) {
        this.context = context;

        RuleFor(m => m.Bar)
            .Must(BeUnique).WithMessage("Bar must be unique!");
    }

    private readonly ApplicationDbContext context;

    public bool BeUnique(int bar) {
        return !context.Foos.Any(foo => foo.Bar == bar);
    }
}

Значение ApplicationDbContext вводится с использованием StructureMap.Чтобы убедиться, что контекст удаляется в конце каждого запроса, я попытался вызвать ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() в обработчике EndRequest для моего приложения.

К сожалению, кажется, что метод Application_EndRequest вызывается до того, как мой класс валидатора сможет выполнить свою работу, и контекст удаляется ко времени выполнения FooValidator.BeUnique.

IsЕсть ли лучший способ выполнить зависящие от базы данных проверки с помощью библиотеки FluentValidation или это единственное решение для перемещения этой логики в другое место (либо в действие контроллера, в саму БД, либо, может быть, в другое место)?

1 Ответ

7 голосов
/ 19 августа 2011

Может быть, валидатор не является http-областью (но синглтоном) и не воссоздается / не внедряется с новым контекстом?В этом случае он пытается использовать удаленный контекст из предыдущего запроса.

...