У нас есть несколько сложных проверок данных в нашем приложении 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 является потокобезопасным, тестируемым и не возвращает устаревшие данные?