Как структурировать классы FluentValidation, которым требуются данные из NHibernate в веб-приложении ASP.NET MVC 5? - PullRequest
0 голосов
/ 02 мая 2019

У нас есть несколько сложных проверок данных в нашем приложении ASP.NET MVC 5, которые должны запрашивать данные в базе данных. Мы используем NHibernate для ORM и FluentValidation для проверки наших моделей представлений.

У меня есть решение, которое "работает" прямо сейчас. Мы создаем наш сеанс NHibernate в начале каждого запроса и сохраняем его в текущем контексте OWIN. Наши классы FluentValidation используют контекст NHibernate, ссылаясь на него через статическое свойство в нашем классе MvcApplication, который просто возвращает сеанс из текущего запроса. Код Псуэдо ниже:

В папке App_Start /:

public partial class Startup
{
    private void ConfigureDataContext(IAppBuilder app)
    {
        app.CreatePerOwinContext<ISession>(() =>
        {
            ISession session = // create and configure NHibernate session

            return session;
        });
    }
}

В Global.asax.cs

public class MvcAcpplication : System.Web.HttpApplication
{
    public static ISession CurrentSession
    {
        get
        {
            return HttpContext.Current
                .GetOwinContext()
                .Get<ISession>("...");
            }
        }
    }
}

Образцы классов FluentValidation

public abstract class BaseValidator<T> : AbstractValidator<T>
{
    protected ISession Session => MvcAcpplication.CurrentSession;
}

public class FooViewModelValidator : BaseValidator<FooViewModel>
{
    public FooViewModelValidator()
    {
        RuleFor(foo => foo.FooId)
            .Must(QueryTheDatabase);
    }

    private bool MustQueryTheDatabase(FooViewModel model, int fooId)
    {
        var foo = Session.Get<Foo>(fooId);

        return foo.SomeMethodThatLoadsMoreData();
    }
}

Мы используем только сеанс NHibernate для извлечения данных в валидаторах. Мы не используем эти объекты для изменения данных & mdash; и это работает & hellip; до сих пор & hellip;

Но это кажется действительно хакерским.

В идеале я хотел бы использовать среду внедрения зависимостей, такую ​​как Autofac. На самом деле у меня есть подтверждение концепции работы с Autofac, за исключением того, что FluentValidators живут за пределами текущего HTTP-запроса, а последующие запросы получают устаревшие данные из NHibernate, что приводит к неправильным ошибкам проверки.

Как я могу структурировать классы FluentValidation, которым требуются сущности из NHibernate во время проверки модели представления, поэтому доступ к сеансу NHibernate является потокобезопасным, тестируемым и не возвращает устаревшие данные?

...